原题链接:https://codeforces.ml/contest/1255/problem/C
题目大意:有1~n个数,给n-2个三元组,每个三元组内有三个数字,位置可以随便变换,找一条路径,符合n-2的三元组的关系,就是这三个数字必须挨着
找出出现次数为1的两个数作为起点和终点,再找出现次数为2的数作为第二个点和倒数第二个点,每找到一个点将此三元组内的三个数的度都减1,每次找度为1的点加入到路径中
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct qq
{
int a,b,c;
}q[100010];
int book[100010],path[100010];
struct node
{
int u[10];
int cnt=0;
}pos[100010];
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
for(int i=0;i<n-2;i++)
{
cin>>q[i].a>>q[i].b>>q[i].c;
book[q[i].a]++;
book[q[i].b]++;
book[q[i].c]++;
pos[q[i].a].u[pos[q[i].a].cnt++]=i;
pos[q[i].b].u[pos[q[i].b].cnt++]=i;
pos[q[i].c].u[pos[q[i].c].cnt++]=i;
}
int io[2],o=0,io2[2];
for(int i=1;i<=n;i++)
{
if(book[i]==1)
{io[o++]=i;}
}
int ss=io[0],ee=io[1];
////////////////////////////////////////////////////
int cxk=pos[ss].u[0];
if(book[q[cxk].a]==2)
{io2[0]=q[cxk].a;}
if(book[q[cxk].b]==2)
{io2[0]=q[cxk].b;}
if(book[q[cxk].c]==2)
{io2[0]=q[cxk].c;}
cxk=pos[ee].u[0];
if(book[q[cxk].a]==2)
{io2[1]=q[cxk].a;}
if(book[q[cxk].b]==2)
{io2[1]=q[cxk].b;}
if(book[q[cxk].c]==2)
{io2[1]=q[cxk].c;}
////////////////////////////////////////////////////
path[1]=ss;path[n]=ee;path[2]=io2[0];path[n-1]=io2[1];
int j=1;
while(j<=n)
{
int kk=pos[ss].cnt,next;
for(int i=0;i<kk;i++)
{
int op=pos[ss].u[i];
book[q[op].a]--;
book[q[op].b]--;
book[q[op].c]--;
if(book[q[op].a]==1&&q[op].a!=io2[1])
{next=q[op].a;}
if(book[q[op].b]==1&&q[op].b!=io2[1])
{next=q[op].b;}
if(book[q[op].c]==1&&q[op].c!=io2[1])
{next=q[op].c;}
}
if(j>2&&j<n-1)
{path[j]=ss;}
ss=next;
j++;
}
for(int i=1;i<=n;i++)
{cout<<path[i]<<" ";}
cout<<endl;
return 0;
}