- D - Circular Dance
- 思路: 随便选定一个起点即可。那就选择 1吧 , 选择建边 来把原来的图 恢复, 题目给出的信息是这个点后面的两个点
- 我们不能确定这个点与谁相连,当能知道的是 后面的两个点一定相连,所以建两个无向边,最终得到的vector 是 每个点都有
- 两个相连的点,一左一右, 题目让输出的是 从左往右 ,所以我们要保证 dfs恢复图的过程中 从1出发是往后走 。
- 第一个遍历的是 g[ 1 ] [ 0 ]所以保证 g[ 1 ] [ 0 ]是 1后面的点即可。-感谢旭总到位的讲解.
-
#include<bits/stdc++.h> using namespace std; #define maxn 234567 vector<int>g[maxn],o; int n,x,y,s,t; void dfs(int u,int p) { if(o.size()==n)return ; o.push_back(u); if(o.size()==n)return ; for(int i=0; i<2; i++) { if(g[u][i]==p)continue; dfs(g[u][i],u); } } int main() { scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%d%d",&x,&y); if(i==1)s=x,t=y; g[x].push_back(y); g[y].push_back(x); } if(g[1][1]==s||g[1][1]==t)swap(g[1][0],g[1][1]); dfs(1,0); for(int i=0; i<n-1; i++)printf("%d ",o[i]); printf("%d\n",o[n-1]); return 0; }
D - Circular Dance-思维-dfs
最新推荐文章于 2020-04-21 02:34:47 发布