HPU1250: HH的米5 【并查集】+【欧拉图】

1250: HH的米5

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 90   Solved: 25
[ Submit][ Status][ Web Board] [ Edit]

Description

HH新买了一台手机小米5,他给自己的新手机设置了一个高端大气上档次的屏幕保护锁(其实就是一个9宫锁屏),保护锁有一个特点,就是需要一笔画下来才能解锁,HH就在想,如果给定N个点和M条边,那么该图是否可以通过一笔将该图画下来呢?他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。规定,所有的边都只能画一次,不能重复画。

Input

第一行只有一个正整数T(T<=10)表示测试数据的组数。每组测试数据的第一行有两个正整数N,M(N<=1000,M<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到N)随后的M行,每行有两个正整数A,B(0<a,b<n),表示编号为a和b的两点之间有连线。< p="">

Output

如果存在符合条件的连线,则输出"Yes", 如果不存在符合条件的连线,输出"No"。

注意输出不包含引号!

Sample Input

2 4 3 1 2 1 3 1 4 4 5 1 2 2 3 1 3 1 4 3 4

Sample Output

No Yes

HINT

Source

还好这题不吭

#include <stdio.h> 
#include <string.h> 
  
#define maxn 1010 
int in[maxn], pre[maxn]; 
  
int ufind(int x) { 
    int a = x, b; 
    while (pre[x] != -1) x = pre[x]; 
    while (a != x) { 
        b = pre[a]; 
        pre[a] = x; 
        a = b; 
    } 
    return x; 
} 
  
bool unite(int x, int y) { 
    x = ufind(x); 
    y = ufind(y); 
    if (x == y) return false; 
    pre[x] = y; 
    return true; 
} 
  
int main() { 
    int T, n, m, u, v, i, cnt; 
    scanf("%d", &T); 
    while (T--) { 
        scanf("%d%d", &n, &m); 
        for (i = 0; i <= n; ++i) { 
            pre[i] = -1; in[i] = 0; 
        } 
        cnt = 0; 
        while (m--) { 
            scanf("%d%d", &u, &v); 
            if (!in[u]) ++cnt; 
            if (!in[v]) ++cnt; 
            ++in[u]; ++in[v]; 
            if (unite(u, v)) --cnt; 
        } 
        if (cnt != 1) { 
            printf("No\n"); 
            continue; 
        } 
        cnt = 0; 
        for (i = 1; i <= n; ++i) 
            if (in[i] & 1) ++cnt; 
        if (cnt == 2 || cnt == 0) 
            printf("Yes\n"); 
        else printf("No\n"); 
    } 
    return 0; 
} 
  
/************************************************************** 
    Problem: 1250 
    User: changmu 
    Language: C++ 
    Result: Accepted 
    Time:0 ms 
    Memory:824 kb 
****************************************************************/ 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值