codeforces(601.C) League of Leesins

原题链接: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;
}

发布了36 篇原创文章 · 获赞 4 · 访问量 1395

猜你喜欢

转载自blog.csdn.net/qq_43781431/article/details/104434598