POJ 1308 Is It A Tree? && NYOJ 129 (나무의 판정 + 병 집)

[제목 링크] 여 기 를 클릭 하 세 요 ~ ~
[제목 대의] 여러 쌍 의 노드 를 정 하여 모든 노드 가 한 그루 의 나 무 를 구성 할 수 있 는 지 판단 한다.
[문제 풀이 사고] 그리고 집합 을 찾 는 기본 동작 은 node, edge 를 정의 하고 node 와 edge 의 수 를 통계 합 니 다. 만약 (edge = = node - 1 | node = 0) 이 트 리 가 될 수 있 습 니 다.
나무의 판정: n 개 노드, 최대 n - 1 개의 링, 1 개의 입 도 는 변 이 고 0 이 되 지 않 는 점, 다른 입 도 는 1 보다 크 지 않 습 니 다. 그러나 poj 데이터 에서 만약 에 110 0 이 요구 에 부합 되 지 않 으 면 자신 이 자신 을 가리 키 지 못 하 는 것 을 주의해 야 합 니 다.
코드:
/*
Author:HRW
    :
n   ,  n-1  
   
       0   
       1
*/
//#include <bits/stdc++.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=100005;
int father[N],sum[N],a,b,node,edge,vis[N],flag;
int find(int x){if(x==father[x]) return x; return father[x]=find(father[x]); }
void Union(int a,int b){
    if(!vis[a]) node++,vis[a]=true;
    if(!vis[b]) node++,vis[b]=true;
    int pa=find(a);
    int pb=find(b);
    if(pa!=pb)
    {
        father[pa]=pb;
        edge++;
    }
    else flag=true;
}
void init(){
    node=edge=0;
    flag=false;
    memset(vis,false,sizeof(vis));
    for(int i=1; i<N; i++) father[i]=i;//father     
}
int main()
{
    int a,b,tot=1;
    init();
    while(scanf("%d%d",&a,&b)&&a!=-1&&b!=-1){
        if(a==0&&b==0){
            printf("Case %d %s
",tot++,(!flag&&(edge==node-1||node==0))?"is a tree.":"is not a tree."); init(); continue; } Union(a,b); } return 0; }

좋은 웹페이지 즐겨찾기