题意: Kamal每天早上都要从A点走到B点。从A点到B点有很多条路, 他每天早上都要先选择好一条路线, 这条路线从A点走到B点,再从B点走回A点。 这条路线不能重复地经过同一条路。 两个地点间可能会有多条路。 比如多次出现了从A到B的路线, 那么表示每次出现的都是不同的路
并查集做法:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define M 210
int num[M];
int findx(int x)
{
int r = x;
while(r!=num[r])
{
r = num[r];
}
int k = x,j;
while(k!=r)
{
j = num[k];
num[k] = r;
k = j;
}
return r;
}
void bing(int x,int y)
{
int fx = findx(x);
int fy = findx(y);
if(fx!=fy)
{
num[fx] = fy;
}
}
int main()
{
int t, k = 1;
int v[M];
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for (int i = 0; i < n; i++)
{
num[i] = i;
v[i] = 0;
}
for (int i = 0; i < m; i++)
{
int a, b;
scanf("%d%d", &a, &b);
v[a]++;
v[b]++;
bing(a,b);
}
int cnt = 0;
for (int i = 0; i < n; i++)
{
if (num[i] == i && v[i]!=0)
{
cnt++;
}
}
int sum = 0;
if(cnt == 1 && m>=2)
{
for(int i=0; i<n; i++)
{
if(v[i]%2!=0)
{
sum++;
//printf("i = %d\n",i);
break;
}
}
if (sum > 0)
{
printf("Not Possible\n");
}
else
{
printf("Possible\n");
}
}
else
{
printf("Not Possible\n");
}
}
return 0;
}
DFS做法: