1. 程式人生 > >第八屆藍橋杯國賽 發現環

第八屆藍橋杯國賽 發現環

代碼 小明 code for 順序 藍橋杯 藍橋 恢復 臺電腦

問題描述   小明的實驗室有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


  輸入保證合法。 輸出格式   按從小到大的順序輸出在環路上的電腦的編號,中間由一個空格分隔。 樣例輸入 5
1 2
3 1
2 4
2 5
5 3 樣例輸出 1 2 3 5 深搜,遇到一個點不是自己的前驅卻已經訪問過且與當前點相鄰,那麽就是從這個點到當前點這條鏈上的點,記錄下來排序輸出。 代碼:
#include <iostream>
#include <cstring>
#include 
<cstdio> #include <cmath> #include <vector> #include <algorithm> using namespace std; vector<int> s[100001]; int f[100001] = {-1}; int e[100001]; int n,a,b,flag = 0,c; void get(int k) { while(k != -1) { e[c ++] = k; k = f[k]; } } void dfs(int
k) { for(int i = 0;i < s[k].size();i ++) { if(flag == -1)return; if(f[k] == s[k][i])continue; if(f[s[k][i]]) { f[s[k][i]] = -1; flag = -1; get(k); return; } f[s[k][i]] = k; dfs(s[k][i]); f[s[k][i]] = 0; } } int main() { scanf("%d",&n); for(int i = 0;i < n;i ++) { scanf("%d%d",&a,&b); s[a].push_back(b); s[b].push_back(a); } dfs(1); sort(e,e + c); if(e)printf("%d",e[0]); for(int i = 1;i < c;i ++) { printf(" %d",e[i]); } }

第八屆藍橋杯國賽 發現環