UVA 10596 - Morning Walk

这道题是判断无向图是否存在欧拉回路:

所有的点的度数(出度和入度之和)为偶数。

所有的点都在一个集合中。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 205

int d[MAXN], p[MAXN];
int N, R;
int find_set( int x)
{
return p[x] == x ? x : ( p[x] = find_set( p[x]) );
}

void union_set( int x, int y)
{
x = find_set( x);
y = find_set( y);
if( x != y)
p[x] = y;
}

int main()
{
int a, b;
while( scanf( "%d%d", &N, &R) == 2)
{
memset( d, 0, sizeof d);
if( R == 0) {
printf( "Not Possible\n");
continue;
}
for( int i = 0; i < N; i ++)
p[i] = i;
while( R --)
{
scanf( "%d%d", &a, &b);
union_set( a, b);
d[a]++;
d[b]++;
}
bool ok = true;
int i;
for( i = 0; d[i] == 0; i ++);
for( int j = 0; j < N; j ++)
if( d[j] > 0 && find_set(i) != find_set(j) )
{
ok = false;
break;
}
int ans = 0;
if( ok)
for( i = 0; i < N; i ++)
if( d[i] % 2 == 1)
ans ++;
if( !ok || ans > 0)
printf( "Not Possible\n");
else
printf( "Possible\n");
}
return 0;
}

 用DFS写,依然是判断度数和是否经过所有点。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 205

int N, R;
int g[MAXN][MAXN], deg[MAXN], ans;
bool ok, vis[MAXN];

void init()
{
int u, v;
memset( g, 0, sizeof g);
memset( deg, 0, sizeof deg);
memset( vis, false, sizeof vis);
for( int i = 0; i < R; i ++)
{
scanf( "%d%d", &u, &v);
g[u][v] = 1;
g[v][u] = 1;
deg[u] ++;
deg[v] ++;
}
}

void dfs( int v)
{
ans ++;
vis[v] = true;
for( int i = 0; i < N; i ++)
if( g[v][i] == 1 && !vis[i])
dfs( i);
}

void euler()
{
ok = true;
ans = 0;
for( int i = 0; i < N; i ++)
if( deg[i] & 1) //度数为奇数
{
ok = false;
return;
}
dfs( 0);
if( ans != N) ok = false;
}

int main()
{
while( scanf( "%d%d", &N, &R) == 2)
{
if( R == 0) {
printf( "Not Possible\n");
continue;
}
init();
euler();
if( ok)
printf( "Possible\n");
else
printf( "Not Possible\n");
}
return 0;
}

 

你可能感兴趣的:(uva)