互いに素セット1272 HDU

HDU 1272

すなわち:データセットの複数の所定の
処理の開始前に与えられた0,0が与えられ、環を形成することができない、唯一のルートが
与えられ-1-1端

環を形成することができる:判定フラグFlag内部機能参加加える
だけルートノード:指定されたサイクルの数を決定し、ルートノードの数は、CNTのみが1であります

注1:提示されたデータは連続番号ではないので、可視配列タグの所定の数が存在しなければならない
注2:0,0のみYesにあるべきです

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<string>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 100005;
typedef long long ll;
int pre[maxn];
bool vis[maxn];
bool flag = 0;
int find(int x){
    int r = x;
    while(r!=pre[r])
        r = pre[r];
    while(x!=r){
        int t = pre[x];
        pre[x] = r;
        x = t;
    }
    return r;
}
void join(int x,int y){
    int fx = find(x);
    int fy = find(y);
    if(fx!=fy)
        pre[fx]  = fy;
    else{
        flag = 1;
    }
}
int main(){
    int x,y;
    while(~scanf("%d %d",&x,&y)){   //读入第一个
        if(x==-1 && y==-1)      //跳出
            break;
        if(x==0 && y==0){
            printf("Yes\n");
            continue;
        }
        memset(vis,0,sizeof(vis));
        for(int i=0; i<maxn; i++)
            pre[i] = i;

        int mmax = max(x,y);
        join(x,y);
        flag = 0;
        vis[x] = vis[y] = 1;
        
        while(scanf("%d %d",&x,&y) && x && y){      //读入剩下数据直到0 0
            mmax = max(mmax,max(x,y));
            join(x,y);
            vis[x] = vis[y] = 1;
        }
        //不能成环
        if(flag){
            printf("No\n");
            continue;
        }
        //只能有一个父节点
        int cnt = 0;
        for(int i=1; i<=mmax; i++)
            if(vis[i] && pre[i] == i)
                cnt++;
        if(cnt==1)
            printf("Yes\n");
        else
            printf("No\n");

    }
    return 0;
}

公開された62元の記事 ウォンの賞賛0 ビュー1738

おすすめ

転載: blog.csdn.net/jhckii/article/details/104565179
おすすめ