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;
    }
}
原文地址:https://www.cnblogs.com/zhanglichen/p/12636470.html