第一次刷图论,对存储什么的还不熟悉,这题用邻接矩阵太大,邻接表不知道怎么弄,还好vector来存可以节省很多空间。
n-1条边可以认为它是一个连通无环图,一棵树
然后深搜,用一个p数组存数每一步的父结点,visit存储该结点是否访问。
不过最后我vector没有清空,wrong answer了。
#include <iostream> #include <cstring> #include <vector> using namespace std; const int Max = 100001; int p[Max]; int visit[Max]; vector<int> a[Max]; void dfs(int s) { //cout << s<< ‘[‘; visit[s] = 1; for(int i = 0 ; i < a[s].size(); i++) if(a[s][i]&&!visit[a[s][i]]) {//cout << ‘!‘; p[a[s][i]] = s; dfs(a[s][i]); } } int main() { int num,n,s; int x,y; cin >> num ; while(num--) { memset(p,-1,sizeof(p)); memset(visit,0,sizeof(visit)); cin >> n >> s; for(int i = 0; i < n-1; i++) { cin >> x >> y; a[x].push_back(y); a[y].push_back(x); } dfs(s); for(int i = 1; i <= n; i++) {cout <<p[i] << ‘ ‘ ;a[i].clear();} cout << endl; } system("pause"); return 0; }
时间: 2024-11-05 21:35:39