hdu1272 小希的迷宫

小希希望任意两个房间有且仅有一条路径可以相通这句话的意思是图是连通的,只有一个连通图

所以这个题需要用用并查集判断任意两点有一条途径,还有图的连通性判断。

1.输入u,v 如果 已经存在find(u) == find(v) ,那么就说明u , v 已经存在一条路径,是No的一种情况

2.对于连通图的所有顶点,只有一个顶点的par[i] = i,所有当多个顶点的par[i] = i 就说明这个图存在多个连通图

3.当第一个数都是0,0时,输出Yes

/***********************************************
 * Author: fisty
 * Created Time: 2015/2/26 22:45:51
 * File Name   : M.cpp
 *********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
#define MAX_N 100100
int u, v;
int ok;
int par[MAX_N];
int vis[MAX_N];
void init(){
    for(int i = 0;i <= MAX_N; i++){ 
        par[i] = i;
        vis[i] = 0;
    }
}
int find(int x){
    if(x == par[x]) return x;
    return par[x] = find(par[x]);
}
bool unio(int x, int y){
    x = find(x);
    y = find(y);
    if(x != y){
        par[x] = y;
        return true;
    }else
        return false;
}
int main() {
    //freopen("in.cpp", "r", stdin);
    cin.tie(0);
    ios::sync_with_stdio(false);
    while(cin >> u >> v && (u != -1 && v != -1)){
        if(!u && !v){
            cout << "Yes" << endl;
            continue;
        }
        init();
        ok = 1;
        int _max = 0, _min = INF;
        while(u || v){
            _max = max(max(_max,u), v);
            _min = min(min(_min,u), v);
            vis[u] = 1; vis[v] = 1;
            if(unio(u, v) == false){
                ok = 0;
            }
            cin >> u >> v;
        }
        if(!ok){
            cout << "No" << endl;
        }else{
            int cnt = 0;
            for(int i = _min;i <= _max; i++){       
                if(find(i) == i && vis[i]){
                    cnt++;
                }
            }
            if(cnt == 1){
                cout << "Yes" << endl;
            }else{
                //Debug(cnt);
                cout << "No" << endl;
            }
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值