JSOI2007 重要的城市

2021-10-02 08:55:49 字數 1412 閱讀 5589

題目描述

參加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 ...