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

    [POI2008]CLO

    Time Limit: 10 Sec Memory Limit: 162 MB

    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

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


    个人觉得题目不是很清楚。。。 大概是如果这个边你要用就直接规定方向就好了。 如果不用这个边就随风消逝了。。。
    清新可爱**题。 我们可以先想一想什么时候可以满足题意。 如果是一棵树的时候显然不可以对吧。 然后如果在一棵树上任意加一条边成环就很完美了。
    ```c++

    include<bits/stdc++.h>

    using namespace std;
    const int maxn = 1e5 + 5;
    vector point[maxn];
    int n, m, fa[maxn], size[maxn], edge[maxn];

    int find(int t) {return (fa[t] == t) ? t : (fa[t] = find(fa[t]));}

    inline void connect(int a, int b)
    {
    a = find(a); b = find(b); edge[a]++;
    if(a == b) return;
    if(a > b) swap(a, b);
    fa[b] = a; size[a] += size[b]; edge[a] += edge[b];
    }

    int main()
    {
    int x, y; scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i) fa[i] = i, size[i] = 1;
    for(int i = 1; i <= m; ++i){
    scanf("%d%d", &x, &y); connect(x, y);
    }
    for(int now, i = 1; i <= n; ++i){
    now = find(i);
    if(edge[now] < size[now]){
    printf("NIE"); exit(0);
    }
    }
    printf("TAK");
    return 0;
    }

    心如花木,向阳而生。
  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/LLppdd/p/9176093.html
Copyright © 2011-2022 走看看