zoukankan      html  css  js  c++  java
  • 【BZOJ1116】[POI2008]CLO 并查集

    【BZOJ1116】[POI2008]CLO

    Description

    Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个town都有且只有一个入度

    Input

    第一行输入n m.1 <= n<= 100000,1 <= m <= 200000 下面M行用于描述M条边.

    Output

    TAK或者NIE 常做POI的同学,应该知道这两个单词的了...

    Sample Input

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

    Sample Output

    TAK

    上图给出了一种连接方式.

    题解:题意——无向边不算入度!!

    所以在一个连通块内,只要存在环,就一定能使这个连通块内的所有点都有一个入度,否则不能

    如果一个连通块内边数≥点数,就说明一定存在环(也可以直接打个标记~)

     

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <queue>
    using namespace std;
    const int maxn=100010;
    int n,m;
    int f[maxn],sv[maxn],se[maxn];
    int find(int x)
    {
    	return (f[x]==x)?x:(f[x]=find(f[x]));
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	int i,j,a,b;
    	for(i=1;i<=n;i++)	f[i]=i,sv[i]=1;
    	for(i=1;i<=m;i++)
    	{
    		scanf("%d%d",&a,&b);
    		if(find(a)!=find(b))
    		{
    			se[f[b]]+=se[f[a]],sv[f[b]]+=sv[f[a]],f[f[a]]=f[b];
    		}
    		se[f[b]]++;
    	}
    	for(i=1;i<=n;i++)
    	{
    		if(find(i)==i&&sv[i]>se[i])
    		{
    			printf("NIE");
    			return 0;
    		}
    	}
    	printf("TAK");
    	return 0;
    }

     

  • 相关阅读:
    [CF845G]Shortest Path Problem?
    [洛谷P4149][IOI2011]Race
    [洛谷P4178]Tree
    [AtCoder AGC27A]Candy Distribution Again
    [洛谷P3806]【模板】点分治1
    [洛谷P2634][国家集训队]聪聪可可
    [CF280C]Game on Tree
    [洛谷P3338][ZJOI2014]力
    [CF438D]The Child and Sequence
    [CF609E]Minimum spanning tree for each edge
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/6825179.html
Copyright © 2011-2022 走看看