const int maxn=200010;
short col[maxn];
int s[2];
struct Edge
{
int to,next;
Edge(){}
Edge(int v,int w):to(v),next(w){}
} edge[maxn];
int head[maxn];
void addedge(int u,int v)
{
edge[head[0]]=Edge(v,head[u]);
head[u]=head[0]++;
}
void init()
{
fill(head,head+maxn,-1);
head[0]=1;
}
int bfs(int u)
{
queue<int> q;
q.push(u);
col[u]=0;
while(!q.empty())
{
int p=q.front();
s[col[p]]++;
q.pop();
for(int i=head[p];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if (col[v]>=0)
{
if (col[v]==col[p]) return -1;
}
else
{
col[v]=1^col[p];
q.push(v);
}
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
init();<span id="_xhe_cursor"></span>
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
int sum=0;
fill(col+1,col+n+1,-1);
for(int i=1;i<=n;i++)
if (col[i]<0)
{
s[0]=s[1]=0;
if (bfs(i)<0)
{
sum=-1;break;
}
else sum+=max(s[0],s[1]);
}
if (n==sum) sum--;
if (sum<1||n-sum<1)
puts("Poor wyh");
else
printf("%d %d\n",sum,n-sum);
}
return 0;
}
Bestcoder 48-1002 / hdu5285 BFS
最新推荐文章于 2015-07-26 11:32:44 发布