題目描述
參加jsoi冬令營的同學最近發現,由於南航校內修路截斷了原來通向計算中心的路,導致去的路程比原先增加了近一公里。而食堂門前施工雖然也截斷了原來通向計算中心的路,卻沒有使路程增加,因為可以找到同樣長度的路作替代。其實,問題的關鍵在於,路截斷的地方是交通要點。
同樣的情況也出現在城市間的交通中。某些城市如果出了問題,可能會引起其他很多城市的交通不便。另一些城市則影響不到別的城市的交通。jsoi冬令營的同學發現這是乙個有趣的問題,於是決定研究這個問題。
他們認為這樣的城市是重要的:如果乙個城市c被破壞後,存在兩個不同的城市a和b(a, b均不等於c),a到b的最短距離增長了(或不通),則城市c是重要的。
jsoi冬令營的同學面對著一張教練組交給他們的城市間交通圖,他們希望能找出所有重要的城市。現在就請你來解決這個問題。
輸入格式
第一行兩個整數n,m,n為城市數,m為道路數
接下來m行,每行三個整數,表示兩個城市之間的無向邊,以及之間的路的長度
輸出格式
一行,按遞增次序輸出若干的數,表示重要的城市。
輸入輸出樣例
輸入 #1複製
4 41 2 1
2 3 1
4 1 2
4 3 2
輸出 #1複製
2n<=200,m<=1e4
很顯然的思路就是列舉每個點。然後 n^4 ,tle。
怎麼只跑一次floyd呢?就是floyd 的時候,記錄最短路的個數。
然後對於我們當前列舉的點 k,如果存在:g[i][j]==g[i][k]+g[k][j]&&num[i][j]==num[i][k]*num[k][j] ,那麼這個點對於i,j來說就是重要點。
ac**:
#pragma gcc optimize("-ofast","-funroll-all-loops")
#include
//#define int long long
using namespace std;
const
int n=
210;
int g[n]
[n],num[n]
[n],n,m,cnt;
void
floyd()
else
if(g[i]
[j]==g[i]
[k]+g[k]
[j])}}
signed
main()
floyd()
;for
(int k=
1;k<=n;k++)}
if(flag) cnt++
,cout<' ';}if
(!cnt)
puts
("no important cities.");
return0;
}
JSOI2007 重要的城市 x
開始 腦殘ing 誒?暴力能過 噼里啪啦碼碼碼 tle tle 啥?看錯複雜度?帶個25的常數 floyd,並記錄兩點間的乙個重要的城市。當出現等距離最短路時說明上該點上次的鬆弛點 並非唯一 刪去否則更新 include include include const int maxn 287 inli...
洛谷 1841 JSOI2007 重要的城市
部落格觀賞效果更佳 給你乙個聯通的無向簡單圖,請你求出有多少個點滿足 刪除之後,存在兩點最短路增長了。點數 200 200 2 00。這個在某種程度上告訴了你這題用什麼演算法 博主注 一邊f lo yd floyd floy d一遍記錄即珂。恕我直言,這簡直是剛學flo yd floyd floy ...
JSOI重要的城市
題目描述 給出n個城市,m條道路以及道路的權值,這樣的城市是重要的 如果乙個城市c被破壞後,存在兩個不同城市a,b a,b均不等於c a,b間的距離增長 或不通 則城市c為重要的。按遞增次序列出所有重要城市的編號。若無重要城市,輸出 no important cities.樣例 city.in 4 ...