在幻想鄉,上白澤慧音是以知識淵博聞名的老師。春雪異變導致人間之里的很多道路都被大雪堵塞,使有的學生不能順利地到達慧音所在的村莊。因此慧音決定換乙個能夠聚集最多人數的村莊作為新的教學地點。人間之里由n個村莊(編號為1..n)和m條道路組成,道路分為兩種一種為單向通行的,一種為雙向通行的,分別用1和2來標記。如果存在由村莊a到達村莊b的通路,那麼我們認為可以從村莊a到達村莊b,記為(a,b)。當(a,b)和(b,a)同時滿足時,我們認為a,b是絕對連通的,記為。絕對連通區域是指乙個村莊的集合,在這個集合中任意兩個村莊x,y都滿足。現在你的任務是,找出最大的絕對連通區域,並將這個絕對連通區域的村莊按編號依次輸出。若存在兩個最大的,輸出字典序最小的,比如當存在1,3,4和2,5,6這兩個最大連通區域時,輸出的是1,3,4。
輸入格式:
第1行:兩個正整數n,m
第2..m+1行:每行三個正整數a,b,t, t = 1表示存在從村莊a到b的單向道路,t = 2表示村莊a,b之間存在雙向通行的道路。保證每條道路只出現一次。
輸出格式:
第1行: 1個整數,表示最大的絕對連通區域包含的村莊個數。
第2行:若干個整數,依次輸出最大的絕對連通區域所包含的村莊編號。
輸入樣例#1:
5 51 2 1
1 3 2
2 4 2
5 1 2
3 5 1
輸出樣例#1:
31 3 5
對於60%的資料:n <= 200且m <= 10,000
對於100%的資料:n <= 5,000且m <= 50,000
solution:
本題特水。
直接tarjan縮點,處理出每個連通分量,排序後用vector儲存一下,最後模擬一下就好了。
**:
/*code by 520 -- 8.22
*/#include
#define il inline
#define ll long long
#define re register
#define for(i,a,b) for(re int (i)=(a);(i)<=(b);(i)++)
#define bor(i,a,b) for(re int (i)=(b);(i)>=(a);(i)--)
using
namespace
std;
const
int n=100005
;int
n,m,dfn[n],low[n],tot,ans;
intto[n],net[n],h[n],cnt;
intscc,bl[n],stk[n],top;
bool
ins[n];
vector
mp[n],tp;
intgi()
il void add(int u,int v)
void tarjan(intu)}
il void
init()
for(i,
1,n) if(!dfn[i]) tarjan(i);
for(i,
1,scc)
else
if(u==ans)
if(f) tp=mp[i];}}
printf(
"%d\n
",ans);
for(i,
0,ans-1) printf("
%d "
,tp[i]);
}int
main()
P1726 上白澤慧音
原題鏈結 直到今天 我才知道 幻想鄉還有這麼一位 看起來很可愛的 老師普通的尋找強連通分量 普通的統計最大 普通的輸出 除了我背錯板子了以外 一切都是那麼完美 今天的幻想鄉 也是和平的一天呢 include include include include include include includ...
P1726 上白澤慧音
提交 8.40k 通過 4.05k 時間限制 1.00s 記憶體限制 125.00mb 題目提供者yeszy 難度提高 省選 歷史分數100 提交記錄 檢視題解 檢視演算法標籤 進入討論版 檢視討論 檢視推薦 展開 在幻想鄉,上白澤慧音是以知識淵博聞名的老師。春雪異變導致人間之里的很多道路都被大雪堵...
P1726 上白澤慧音
tarjan模板題,從第乙個結點開始挨個求極大連通分量,完了之後,按順序找第乙個出現的結點數最多的極大連通分量就是答案,排序輸出即可。include include include include includeusing namespace std const int n 5010,m 10001...