時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:3 描述
在乙個吝嗇的國度裡有n個城市,這n個城市間只有n-1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市(假設你不走重複的路)。
輸入
第一行輸入乙個整數m表示測試資料共有m(1<=m<=5)組
每組測試資料的第一行輸入乙個正整數n(1<=n<=100000)和乙個正整數s(1<=s<=100000),n表示城市的總個數,s表示參觀者所在城市的編號
隨後的n-1行,每行有兩個正整數a,b(1<=a,b<=n),表示第a號城市和第b號城市之間有一條路連通。
輸出每組測試資料輸n個正整數,其中,第i個數表示從s走到i號城市,必須要經過的上乙個城市的編號。(其中i=s時,請輸出-1)
樣例輸入
110 1
1 91 8
8 10
10 3
8 61 2
10 4
9 53 7
樣例輸出
-1 1 10 10 9 8 3 1 1 8
思路:我發現對於這樣的需要自己建立樹或者圖的題目對我來說真的是個難點;
本題的要求需要我們建立的是乙個無向圖(一條邊可以連通兩個城市互相到達),最後,由於需要從s城市為起點到達t城市且需要記錄他的前乙個城市
是多少,我們用pre[i]來儲存從s到i號城市所要經過的上乙個城市,pre[a]=b,表示b指向a,那麼問題來了a只能由乙個城市指向,
否則它的值會發生丟失
初始化 pre[i]都為0;
對於每組邊的兩節點 a b
若 pre[a]=0,則沒有城市指向,pre[a]=b;
若pre[a]!=0,說明已經有城市指向a,我們就需要調整有向圖的方向,即要讓pre[b]=a,(去讓a指向b)
但是讓a指向b指向我們需要判斷是否有城市指向了b,即pre[b]是否為0,若有則此值將會被覆蓋,所以我們在將a指向b之前需要將指向b的箭頭調
轉方向,即如果t指向 b,則調轉方向另b指向t(乙個城市可以指向多個城市,但乙個城市只能被乙個城市指向),依次遞迴下去,直到找到同乙個
未被指向的,然後改變方向,從而我們就實現了有向圖的180翻轉;
完成上述操作後,因為我們是要從s城市出發,即以s城市為樹的根節點建立有向圖,所以在對s城市進行上述遞迴就可以得到乙個從s城市出發的有向
圖;然後輸出結果即可;
ac**:
#include#includeint n,m,s,pre[100010];void dfs(int x)
}int main()
}dfs(s);
pre[s]=-1;
printf("%d",pre[1]);
for(int i=2;i<=n;i++)
printf(" %d",pre[i]);
printf("\n");
}return 0;
}
第二種方法 vector建樹加dfs
#include#include#include#define n 100010using namespace std;
vectorv[n];
int pre[n];
void dfs(int x)
return ;
}int main()
pre[s]=-1;
dfs(s);
printf("%d",pre[1]);
for(int i=2;i<=n;i++)
printf(" %d",pre[i]);
printf("\n");
}return 0;
}
NYOJ 20 吝嗇的國度 DFS
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...
NYOJ 20 吝嗇的國度 DFS
吝嗇的國度 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入 ...
nyoj20 吝嗇的國度(dfs)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 在乙個吝嗇的國度裡有n個城市,這n個城市間只有n 1條路把這個n個城市連線起來。現在,tom在第s號城市,他有張該國地圖,他想知道如果自己要去參觀第t號城市,必須經過的前乙個城市是幾號城市 假設你不走重複的路 輸入第一行輸入乙個...