小明的實驗室有n臺電腦,編號1~n。原本這n臺電腦之間有n-1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。
不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路**現了環路。環路上的電腦由於兩兩之間不再是只有一條路徑,使得這些電腦上的資料傳輸出現了bug。
為了恢復正常傳輸。小明需要找到所有在環路上的電腦,你能幫助他嗎?
輸入格式
第一行包含乙個整數n。
以下n行每行兩個整數a和b,表示a和b之間有一條資料鏈結相連。
對於30%的資料,1 <= n <= 1000
對於100%的資料, 1 <= n <= 100000, 1 <= a, b <= n
輸入保證合法。
輸出格式
按從小到大的順序輸出在環路上的電腦的編號,中間由乙個空格分隔。
樣例輸入
51 2
3 12 4
2 55 3
樣例輸出
1 2 3 5
這道題,因為電腦直接形成了環路,只要能夠找到兩台電腦是相鄰的關係,那麼把這兩台電腦作為這個環路的起點和終點進行搜尋,那麼肯定可以找到這個環路。
需要注意,資料太大,很容易就超時了,所以在電腦連線時,要用乙個vector容器進行儲存,不能用二維陣列進行儲存;當然了,在使用並查集是要記得路徑的壓縮,不然也是超時。
#include#include#include#includeusing namespace std;
int n;//電腦的數量;
int a,b;
int s,e;//記錄在環路上的兩台電腦;
int f[100010];//並查集中記錄boos節點;
int book[100010];//深搜中用來標記;
vectorq[200010];//儲存和電腦i相連的電腦;
int flag;
int tt;
int qq;
void init()//初始化;
}int getf(int v)//找boos;
void merge(int u,int v)//合併;
else
return ;
}void dfs(int x)
else
printf(" %d",i);}}
printf("\n");
flag=1;
return ;
}for(int i=0; i}
return ;
}int main()
flag=0;
tt=0;
memset(book,0,sizeof book);
book[s]=1;
dfs(s);
}return 0;
}
藍橋杯 發現環(並查集 DFS)
問題描述 小明的實驗室有n臺電腦,編號1 n。原本這n臺電腦之間有n 1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路 現了環路。環路上的電腦由於兩兩之間不再是只有一條路徑,使...
發現環 藍橋(並查集 dfs)
試題 歷屆試題 發現環 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 小明的實驗室有n臺電腦,編號1 n。原本這n臺電腦之間有n 1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加...
藍橋杯 歷屆試題 發現環 c語言
發現環 時間限制 1.0s 記憶體限制 256.0mb 問題描述 小明的實驗室有n臺電腦,編號1 n。原本這n臺電腦之間有n 1條資料鏈結相連,恰好構成乙個樹形網路。在樹形網路上,任意兩台電腦之間有唯一的路徑相連。不過在最近一次維護網路時,管理員誤操作使得某兩台電腦之間增加了一條資料鏈結,於是網路 ...