[kuangbin帶你飛]專題五 並查集---poj1308 (這裏給了一種圖的判環方法,自環和內環)

N - Is It A Tree? POJ - 1308

hdu那題題解,這裏不做贅述

反思

  1. 無論有向圖還是無向圖,他們的判斷方法都一樣。

(poj1308 和 hdu1272 一箇中文一個英文)真就白給

AC

#include <iostream>
#include <cstring>
#include <cstdio>
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
#define mst(x,a) memset(x,a,sizeof(x))
using namespace std;
const int maxn=1e5+10;
int flag,max_num;
int f[maxn],vis[maxn];
int find(int x)
{
    if(f[x]==-1)return x;
    return f[x]=find(f[x]);
}
void merge(int u, int v)
{
    int uf=find(u);
    int vf=find(v);
    vis[u]=vis[v]=1;
    max_num=max(u,max(v,max_num));
    if(uf==vf)flag=0;
    else f[uf]=vf;
}
int main()
{
    int n,m,kase=0;
    while(~scanf("%d%d", &n,&m))
    {
        max_num=0;
        flag=1;
        if(n==m&&n==-1)break;
        mst(vis,0);
        mst(f,-1);
        if(n==0){printf("Case %d is a tree.\n",++kase);continue;}
        merge(n,m);
        while(scanf("%d%d", &n,&m)&&(n|m))merge(n,m);
        int cnt=0;
        For(i,1,max_num)if(vis[i]&&find(i)==i)cnt++;
        if(cnt==1&&flag)printf("Case %d is a tree.\n",++kase);
        else printf("Case %d is not a tree.\n",++kase);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章