zoukankan      html  css  js  c++  java
  • hdu--1878--欧拉回路(并查集判断连通,欧拉回路模板题)

     题目链接

     1 /*
     2 
     3     模板题-------判断欧拉回路 
     4      
     5     欧拉路径,无向图
     6     1判断是否为连通图, 
     7     2判断奇点的个数为0
     8 */
     9 #include <iostream> 
    10 #include <cstring>
    11 #include <vector>
    12 #include <cstdio>
    13 using namespace std;
    14 struct DisjoinSet {//并查集判断是否连通
    15     vector<int> father, rank;
    16     
    17     DisjoinSet(int n): father(n), rank(n) {
    18         for (int i=0; i<n; i++) {
    19             father[i] = i;
    20         }
    21     }
    22     
    23     int easy_find(int v)  {//非递归 
    24         int k, j, r;
    25         r = v;
    26         while (r!=father[r]) {
    27             r = father[r];
    28         }
    29         k = v;
    30         while (k!=r) {
    31             j = father[k];
    32             father[k] = r;
    33             k = j;
    34         }
    35         return r;
    36     }
    37     void merge(int x, int y) {
    38         int a = easy_find(x), b = easy_find(y);
    39         if (rank[a] < rank[b]) {
    40             father[a] = b;
    41         } else {
    42             father[b] = a;
    43             if (rank[b] == rank[a]) {
    44                 ++rank[a];
    45             }
    46         }
    47     }
    48 } ; 
    49 
    50 const int MAXN = 1010;
    51 int edge[MAXN];
    52 int p, q;
    53 int main()
    54 {
    55 //    freopen("in.txt", "r", stdin);
    56     while (~scanf("%d %d", &p, &q) && p) {
    57         memset(edge, 0, sizeof(edge));
    58         DisjoinSet mfs(1010);
    59         for (int i=0; i<q; i++) {
    60             int a, b;
    61             scanf("%d %d", &a, &b);
    62             edge[a]++;
    63             edge[b]++;
    64             mfs.merge(a, b);
    65         }
    66         int father = mfs.easy_find(1);
    67         int ct = 0;
    68         for (int i=1; i<=p; i++) {
    69             if (mfs.father[i] != father) {
    70                 ct = -1;
    71                 break;
    72             }
    73             if (edge[i] & 1) ct++;
    74         }
    75         if (ct == 0) printf("1
    ");//欧拉回路
    76         else printf("0
    ");
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    专题三--1005
    专题三--1009
    专题三--1017
    背包九讲
    专题三--1003
    专题三--1004
    专题三--1015
    [洛谷P1220]关路灯
    [洛谷P1776]宝物筛选
    [USACO14JAN]Recording the Moolympics
  • 原文地址:https://www.cnblogs.com/slothrbk/p/8855904.html
Copyright © 2011-2022 走看看