CF1255C League of Leesins(图论)
题意:
给出N-2个三元组,这些三元组内部顺序都被打乱,同时不同三元组之间的先后顺序也被打乱,请你还原这个序列!
题解:
建图,每个三元组内部两两建边,然后统计每个元素在所有组中的出现次数。
不难发现,只出现过一次的一定是起点或终点。
确定起点之后,遍历起点所连的点,出现两次的是第二个点。
确定前两个点之后每次从第一个点所连的点里找出未访问的节点,确定为第三个节点,再把前两个点往后推,循环处理。
思维+图论,又没处理好...
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+100; vector<int> g[maxn]; map<int,int> pos; int visit[maxn]; int main () { int N; scanf("%d",&N); for (int i=1;i<=N-2;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); g[x].push_back(y),g[x].push_back(z); g[y].push_back(x),g[y].push_back(z); g[z].push_back(y),g[z].push_back(x); pos[x]++,pos[y]++,pos[z]++; } int f1; for (f1=1;f1<=N;f1++) if (pos[f1]==1) break; int f2; if (pos[g[f1][0]]==2) f2=g[f1][0]; else f2=g[f1][1]; visit[f1]=1; visit[f2]=1; printf("%d %d",f1,f2); for (int i=1;i<=N-2;i++) { int f3; for (int j=0;j<g[f1].size();j++) if (!visit[g[f1][j]]) { f3=g[f1][j]; break; } visit[f3]=1; printf(" %d",f3); f1=f2,f2=f3; } }