///////////////////////////////////////////////////////////////////////////////////////////////////////
作者:tt267
声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0
转载请注明:http://blog.csdn.net/tt2767/article/details/45420067
///////////////////////////////////////////////////////////////////////////////////////////////////////
比赛链接:http://hihocoder.com/contest/hiho49
题目链接:http://hihocoder.com/problemset/problem/1176
1.记录并判定每个点的度
2.直接用并查集判断无向图是否连通
#include<string.h>
#include<stdio.h>
#define N 1000000
int pre[N];
int rank[N];
int edge[N];
int n,m,u,v;
int find(int x);
int join(int x,int y);
void ini(void);
int same(int x,int y);
bool solve();
int main()
{
ini();
memset(edge,0,sizeof(edge));
scanf("%d%d",&n,&m);
for(int i = 0 ; i < m ; i++)
{
scanf("%d%d",&u,&v);
edge[--u]++; //别忘记把值减1
edge[--v]++;
join(u,v);
}
puts(solve()?"Full":"Part");
return 0;
}
bool solve()
{
bool flag = true;
int Count = 0;
for(int i = 1 ; i < n ; i++ ) //判断图是否连通
{
if(!same(0,i))
{
flag= false;
break;
}
}
for(int i = 0 ; i < m ; i++) //统计有几个边是奇数的
{
if(edge[i] % 2 != 0)
Count++;
}
if((Count ==0 || Count == 2) && flag)
return true;
return false;
}
void ini(void)
{
int i;
for(i = 0 ; i < N ; i++)
pre[i] = i,rank[i] = 0;
}
int join(int x,int y)
{
int fx = find(x),fy = find(y);
if(fx == fy)
return 0;
if(rank[fx] > rank[fy])
{
pre[fy] = fx;
}
else
{
pre[fx] = fy;
if(rank[fx] == rank[fy])
rank[fy]++;
}
}
int find (int x)
{
int r = x;
while(r != pre[r])
r = pre[r];
int i = x,j;
while( r != pre[i])
{
j = pre[i];
pre[i] = r;
i = j;
}
return r;
}
int same(int x,int y)
{
return find(x) == find(y);
}
原文地址:http://blog.csdn.net/tt2767/article/details/46391927