欧拉回路资料:传送门
这题- - 居然有欧拉回路
题意告诉我说要排成一个序列.... 序列 ....
大致思路是先用并查集判联通, 然后看是否满足有向图构成欧拉回路或者欧拉路径的条件
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int qq = 1e5 + 10;
char x[1100];
int pre[30];
int in_degree[30], out_degree[30];
int find(int x){
return x == pre[x]?x:pre[x] = find(pre[x]);
}
int main(){
int t; scanf("%d", &t);
while(t--){
memset(in_degree, 0, sizeof(in_degree));
memset(out_degree, 0, sizeof(out_degree));
for(int i = 0; i < 26; ++i) pre[i] = i;
int n ; scanf("%d", &n);
int m = n;
while(m--){
scanf("%s", x);
int statr = x[0]-'a', end = x[strlen(x) - 1]-'a';
in_degree[statr]++;
out_degree[end]++;
int a = find(statr), b = find(end);
if(a != b) pre[a] = b;
}
bool flag = true;
int cnt = 0;
for(int i = 0; i < 26; ++i)
if(in_degree[i]+out_degree[i]){
if(find(i) == i) cnt++;
}
if(cnt != 1) flag = false;
if(!flag){
printf("The door cannot be opened.\n");
continue;
}
int ans = 0, res = 0;
for(int i = 0; i < 26; ++i)
if(in_degree[i] != out_degree[i]){
if(in_degree[i] == out_degree[i] + 1) ans++;
else if(in_degree[i] + 1 == out_degree[i]) res++;
else{
flag = false;
break;
}
}
if((ans != 0 || res != 0 ) && (ans != 1 || res != 1)) flag = false;
if(flag) printf("Ordering is possible.\n");
else printf("The door cannot be opened.\n");
}
return 0;
}