/*
ID: j.sure.1
PROG:
LANG: C++
*/
/****************************************/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <climits>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
/****************************************/
const int N = 1e5, M = 1e5;
int m, st;
int pi, id[N], od[N], path[M];
int tot, head[N];
bool vis[N];
struct Node {
int v, next;
}edge[M];
int sta[M];
void add(int u, int v)
{
edge[tot].v = v;
edge[tot].next = head[u];
head[u] = tot++;
}
bool judge()
{
st = -1;
int one = 0;
for(int i = 0; i < N; i++) if(vis[i]) {
if(st == -1) st = i;
if(abs(od[i]-id[i]) >= 2) return false;
if(abs(od[i]-id[i]) == 1) {
one++;
if(od[i] > id[i]) st = i;
if(one > 2) return false;
}
}
if(one == 1) return false;
return true;
}
void Euler()
{
int top = -1;
sta[0] = st;
top++;
while(top != -1) {
int u = sta[top], i;
for(i = head[u]; i != -1; i = edge[i].next) {
if(edge[i].v != -1) {
int v = edge[i].v;
edge[i].v = -1;
top++;
sta[top] = v;
break;
}
}
if(i == -1) {
path[pi++] = u;
top--;
}
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--) {
tot = 0;
memset(head, -1, sizeof(head));
memset(id, 0, sizeof(id));
memset(od, 0, sizeof(od));
memset(vis, 0, sizeof(vis));
scanf("%d", &m);
int u, v, m;
for(int i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
add(u, v);
vis[u] = vis[v] = 1;
od[u]++; id[v]++;
}
bool flag = judge();
pi = 0;
if(flag) Euler();
if(pi != m + 1) puts("No solution");
else {
printf("%d", path[pi-1]);
for(int i = pi-2; i >= 0; i--) {
printf("->%d", path[i]);
}
}
}
return 0;
}
欧拉回路求解 Fleury模板
最新推荐文章于 2020-03-01 20:22:53 发布