题意简单粗暴地告诉了我们用欧拉回路来做,这样出题有什么意思?本来可以从一道题收获到什么,但是这种水题不就是纯粹浪费时间吗?如果跳过不做看着那么多绿色中的一块白色真是无法忍受!作者出这种题的目的何在!
对于这种作者,我只想说:
我喜欢!
最基本的欧拉回路。不说了,注意n可以为0.
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 250;
int road[MAXN][MAXN];
int in[MAXN];
int out[MAXN];
int vis[MAXN];
void DFS(int num);
int main()
{
//freopen("input.txt", "r", stdin);
int T, n, i, a, b;
bool flag;
while (~scanf("%d%d", &T, &n))
{
memset(in, 0, sizeof(in));
memset(out, 0, sizeof(out));
memset(road, 0, sizeof(road));
if (n == 0)
{
printf("Not Possible\n");
continue;
}
flag = true;
for (i = 0; i < n; i++)
{
scanf("%d%d", &a, &b);
road[a][b] = road[b][a] = 1;
out[a]++;
in[b]++;
}
//先判断各个点的度数。
for (i = 0; i < T; i++)
if ((in[i] + out[i]) % 2)
{
flag = false;
break;
}
if (flag)
{
for (i = 0; i < MAXN; i++)
if (road[0][i])
DFS(i);
for (i = 0; i < T; i++)
if ((in[i] || out[i]) && !vis[i])
{
printf("Not Possible\n");
break;
}
if (i == T)
printf("Possible\n");
}
else
printf("Not Possible\n");
}
return 0;
}
void DFS(int num)
{
vis[num] = 1;
for (int i = 0; i < MAXN; i++)
if (road[num][i] && !vis[i])
DFS(i);
}