重要城市有三個性質如下:
1.重要城市能對其他兩個不同城市的最短路徑做出貢獻
2.重要城市具有唯一性,如果兩不同城市之間的最短路徑有兩種中間城市情況,那麼這兩個中間城市可以彼此代替,就都不能成為重要城市
3.重要城市具有替代性,對於兩不同城市間的一種最短路徑情況,該路徑上所有中間城市皆為重要城市;如果出現了一種更優最短路徑情況,先前路徑上所有中間城市皆非重要城市,更優解者是。
跑floyd,並記錄兩點間的乙個重要的城市。
如果兩個點的距離更新,則重要的城市也更新。
如果兩個點的距離在計算時出現與原來結果相等時,就說明可能出現多條最短路,這時刪掉重要的城市。
最後列舉兩個點,把它們之間的重要的城市去重後記錄下來,排序輸出即可。
由於在floyd中,對於每個中點,其他點對都進行過考慮,因此答案是不會出現遺漏的。
#include #include #include #include #include #include #include #define re register
using namespace std;
const int maxn = 205;
const int maxm = 200005;
inline int read()
while(ch >= '0' && ch <= '9')
return x * f;
}int n,m,u,v,w;
int dis[maxn][maxn],imp[maxn][maxn];
bool vis[maxn];
int ans[maxm],cnt;
inline void floyd()
else if(dis[i][j] == dis[i][k] + dis[k][j])
}}int main()
floyd();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(imp[i][j] > 0 && !vis[imp[i][j]])
if(cnt == 0)
sort(ans + 1 , ans + 1 + cnt);
for(int i=1;i<=cnt;i++) printf("%d ",ans[i]);
return 0;
}
洛谷 1841 JSOI2007 重要的城市
部落格觀賞效果更佳 給你乙個聯通的無向簡單圖,請你求出有多少個點滿足 刪除之後,存在兩點最短路增長了。點數 200 200 2 00。這個在某種程度上告訴了你這題用什麼演算法 博主注 一邊f lo yd floyd floy d一遍記錄即珂。恕我直言,這簡直是剛學flo yd floyd floy ...
洛谷P6688 可重集
給出乙個長度為 n 的非負整數序列 a 1,a 2,a 3,ldots,a n 給出 q 次操作,每次先給出乙個引數 op 本質相同的定義 令區間長度為 text 序列 p dots p 為 a dots a 公升序排序後的結果,序列 q dots q text 為 a dots a 公升序排序後的...
洛谷 P1272 重建道路
題目描述 一場可怕的 後,人們用n個牲口棚 1 n 150,編號1.n 重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次 會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p ...