码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1116 [POI2008]CLO

时间:2018-06-13 11:29:31      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:不用   point   lin   bzoj   一个   image   inf   IV   wap   

[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

技术分享图片

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



个人觉得题目不是很清楚。。。
大概是如果这个边你要用就直接规定方向就好了。
如果不用这个边就随风消逝了。。。


清新可爱**题。
我们可以先想一想什么时候可以满足题意。
如果是一棵树的时候显然不可以对吧。
然后如果在一棵树上任意加一条边成环就很完美了。


#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
vector<int> 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;
}

bzoj1116 [POI2008]CLO

标签:不用   point   lin   bzoj   一个   image   inf   IV   wap   

原文地址:https://www.cnblogs.com/LLppdd/p/9176093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!