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;
    }

    心如花木,向阳而生。
  • 相关阅读:
    大厂面试爱问的「调度算法」,20 张图一举拿下
    键盘敲入 A 字母时,操作系统期间发生了什么
    “花呗还不起了,能不能把支付宝服务器炸掉?”
    Tomcat 报SocketException 断开的管道错误
    linux中grep命令的用法
    Linux的关机与重启
    globbing:文件名通配
    转载:Git 团队协作中常用术语
    Java多线程学习笔记
    RectTransform简析
  • 原文地址:https://www.cnblogs.com/LLppdd/p/9176093.html
Copyright © 2011-2022 走看看