题目的意思就是“一笔贯穿1->N的环状路线”,
这就是经典的欧拉回路问题
首先由于是环状的欧拉回路,要求每个节点的值必须为偶数【就是进入次数等于出去次数】
第二个就是利用dfs进行遍历,看能否贯穿整个路线,记住要标记节点是否访问过
dfs完了记得检验是否有节点没有访问过!,如果有的话说明没有遍历成功
/*本题目应该是一个单向的一笔画
也就是欧拉回路*/
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define MAX_SIZE 200 + 10
int G[MAX_SIZE][MAX_SIZE];
int visa[MAX_SIZE];
int counts[MAX_SIZE];
int n,m;
void dfs(int u)
{
visa[u]=1;
for(int i=0;i<m;i++)
if(!visa[i]&&G[u][i])/*可以从u->i的话*/
{
dfs(i);/*继续从i开始走*/
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
int ok=1;
memset(G,0,sizeof(G));
memset(visa,0,sizeof(visa));
memset(counts,0,sizeof(counts));
for(int i=0;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
G[a][b]++;
counts[a]++;
counts[b]++;
}
for(int i=0;i<m;i++)
{
if(counts[i]&1||!counts[i])
/*如果一个点出入不等或者说这个点根本没有遍历到*/
{
ok=0;
break;
}
}
dfs(0);/*从0开始遍历吧*/
for(int i=0;i<m;i++)
if(!visa[i])
{
ok=0;
break;
}
if(ok)
printf("Possible");
else
printf("Not Possible");
printf("\n");
}
return 0;
}