zoukankan      html  css  js  c++  java
  • [POI2008] CLO

    zz:http://hzwer.com/3010.html
    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

    Sol:

    如果点构成一个环,则满足条件.并且环上的点如果指向别的点,也是满足条件的

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    inline int read()
    {
        int x=0;char ch=getchar();
        while(ch<'0'||ch>'9'){ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x;
    }
    int n,m;
    int fa[100005];
    bool mark[100005];
    int find(int x)
    {return x==fa[x]?x:fa[x]=find(fa[x]);}
    int main()
    {
    	n=read();m=read();
    	for(int i=1;i<=n;i++)
    	    fa[i]=i;
    	for(int i=1;i<=m;i++)
    	{
    		int u=read(),v=read();
    		int p=find(u),q=find(v);
    		if(p!=q)
    		    {
    			         fa[p]=q;
    			         mark[q]=(mark[p]|mark[q]);
    			         //p,q只要有一个有环,则q所在的连通块也满足条件 
    			}
    		else 
    		       mark[p]=1;
    	}
    	for(int i=1;i<=n;i++)
    	    if(!mark[find(i)])
    	        {printf("NIE");return 0;}
    	printf("TAK");
    	return 0;
    }
    
  • 相关阅读:
    Parcel与Parcelable剖析
    Binder文集
    Charles 使用教程
    AsyncTask
    Android 编译时注解
    scanf(),gets(),getchar()
    银行家算法
    最长公共子序列(LCS)问题
    动态规划 求解数字三角形最大值
    参数 存在二维数组
  • 原文地址:https://www.cnblogs.com/cutemush/p/12485809.html
Copyright © 2011-2022 走看看