国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

CODEVS 1332 上白澤慧音

2019-11-11 00:08:09
字體:
來源:轉載
供稿:網友

題目描述

在幻想鄉,上白澤慧音是以知識淵博聞名的老師。春雪異變導致人間之里的很多道路都被大雪堵塞,使有的學生不能順利地到達慧音所在的村莊。因此慧音決定換一個能夠聚集最多人數的村莊作為新的教學地點。人間之里由N個村莊(編號為1..N)和M條道路組成,道路分為兩種一種為單向通行的,一種為雙向通行的,分別用1和2來標記。如果存在由村莊A到達村莊B的通路,那么我們認為可以從村莊A到達村莊B,記為(A,B)。當(A,B)和(B,A)同時滿足時,我們認為A,B是絕對連通的,記為<A,B>。絕對連通區域是指一個村莊的集合,在這個集合中任意兩個村莊X,Y都滿足<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行:若干個整數,依次輸出最大的絕對連通區域所包含的村莊編號。

樣例輸入

5 5

1 2 1

1 3 2

2 4 2

5 1 2

3 5 1

樣例輸出

3

1 3 5

數據范圍及提示

對于60%的數據:N <= 200且M <= 10,000

對于100%的數據:N <= 5,000且M <= 50,000

分析

tarjan的裸題,但是要稍微記錄一下當前強聯通分量是由哪些組成的,而且有多長,其實在做的時候染一下色就好了。

代碼

#include <bits/stdc++.h>#define N 5010using namespace std;stack <int> S;vector <int> E[N];int dfn[N],low[N];int belone[N],num[N];int cnt = 0;int tot = 0;int ans = 0;int n,m;bool vis[N];void tarjan(int x){ low[x] = dfn[x] = cnt++; S.push(x); vis[x] = true; for (int i = 0; i < E[x].size(); i++) { int v = E[x][i]; if (!dfn[v]) { tarjan(v); low[x] = min(low[x],low[v]); } else if(vis[v]) low[x] = min(low[x],dfn[v]); } if (dfn[x] == low[x]) { belone[x] = ++cnt; num[cnt]++; while (true) { int now = S.top(); S.pop(); vis[now] = false; num[cnt]++; belone[now] = cnt; if(now == x) break; } }}int main(){ scanf("%d%d",&n,&m); for (int i = 1; i <= m; i++) { int k,x,y; scanf("%d%d%d",&x,&y,&k); E[x].push_back(y); if (k == 2) E[y].push_back(x); } for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); int s; for (int i = 1; i <= n; i++) if (num[belone[i]] > ans) { ans = num[belone[i]]; s = i; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海宁市| 东港市| 谢通门县| 佛教| 大荔县| 绥芬河市| 大石桥市| 福建省| 临高县| 肥乡县| 怀来县| 盐津县| 彝良县| 将乐县| 牟定县| 盘锦市| 宜章县| 大方县| 中阳县| 遂溪县| 大理市| 密云县| 临沭县| 琼结县| 高碑店市| 抚州市| 武义县| 冷水江市| 东兴市| 阜宁县| 保亭| 大关县| 霞浦县| 嘉义县| 宁乡县| 开阳县| 紫阳县| 西城区| 镇宁| 天门市| 新丰县|