オリジナルタイトルリンクします。https://codeforces.ml/contest/1255/problem/C
タイトル効果:、各トリプレット内の3つの数字は、トリプレットの数に1 N、N-2があり、位置が容易に、すなわち、N-2トリプルの関係を満たすように経路を見つけるために変換することができます。これらの3つの数字は、次のでなければなりません
開始および終了点として数1の2つの存在を見つけるために、発生数が第二の点として数2と最後から二番目の点、3つの数字このトライアドのポイント内の各検索で見つけ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;
}