这题需要判断两个地方:所有点是否在同一个集合中以及各点的度是否均为偶数(即是否可以构成欧拉回路)。
用dfs得到一个连通分量中点的个数,判断是否与总的点数目相等即可知道是否所有点均在一个连通分量中。
我的代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;
int degree[200];
int adj[200][200];
int visit[200];
int N,R;
void dfs(int n, int &c)
{
c++;
visit[n]=1;
for(int i=0; i<N; i++)
{
if(adj[i][n] && !visit[i])
{
dfs(i,c);
}
}
return ;
}
int main()
{
int ta,tb;
while(cin >> N >> R)
{
memset(adj,0,sizeof(adj));
memset(degree,0,sizeof(degree));
memset(visit,0,sizeof(visit));
for(int i=0; i<R; i++)
{
cin >> ta >> tb;
adj[ta][tb]=adj[tb][ta]=1;
degree[ta]++;
degree[tb]++;
}
int ok=1,count=0;
for(int i=0; i<N; i++)
{
if(degree[i]%2==1) { ok=0; break;}
}
if(!ok) cout << "Not Possible\n";
else
{
dfs(0,count); //cout << count << endl;
if(count != N) cout << "Not Possible\n";
else cout << "Possible\n";
}
}
return 0;
}