[POI2008]CLO-Toll

题意描述

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

题解:

这道题是并查集的一种应用。

我们在大脑中开始想象。

所有点入度都为1是一种什么样子的图呢?

树。

对,对于图论的题,我们先想一想它有没有可能是特殊图,具体一点说,是树状图。

所以我们想到,如果是一棵从根节点层层向下指向的树,我们能百分百保证这棵树上的所有点的入度为1.

如果你点头了,说明你错的很惨。

因为根节点的入度为0.

所以我们再想一想,什么样的图能使得树的根节点的入度不为0而为1?

基环树。

我们分析一下,什么时候能使得这张图无论如何也不能出现题目所说的情况?

假如一个连通块中不存在环,就绝对不会使得每个点都有1个入度。

所以我们开始想判环。

于是我们想到了并查集。

每条边链接的两个点,如果这两个点属于不同的块,就可以将其合并,并在其祖先上打标记。

如果两个祖先有一个倍打过标记,那整个的就都可以打标记,

所以AC本题:

#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
int fa[100001];
int v[100001];
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
fa[fx]=fy;
v[fy]=(v[fx]|v[fy]);
}
else
v[fx]=1;
}
for(int i=1;i<=n;i++)
if(v[find(i)]==0)
{
printf("NIE");
return 0;
}
printf("TAK");
return 0;
}

最新文章

  1. Ubuntu搭建lnmp环境
  2. AngularJS API之$injector ---- 依赖注入
  3. table表格制作
  4. 使用perl实现scp批量分发
  5. 《SAS编程与数据挖掘商业案例》学习笔记之十七
  6. java编程小技巧
  7. WebStorm开发Nodejs环境搭建,包括破解最新的WebStom11破解
  8. 支持各种特殊字符的 CSV 解析类 (.net 实现)(C#读写CSV文件)
  9. 记录一则ASM实例阻塞,rbal进程异常的案例
  10. mvc项目远程发布到windows server服务器
  11. Similarity measure
  12. Servlet的创建二以及生命周期
  13. 机器学习基石笔记:13 Hazard of Overfitting
  14. java把list分成几个list
  15. doubleclick adx note
  16. 将MYSQL的GBK数据库转成_UTF-8数据库的简便方法
  17. 数据库以及pymysql
  18. 用Beautiful Soup解析html源码
  19. selenium除错
  20. beta阶段——项目复审

热门文章

  1. How to: Display a List of Non-Persistent Objects in a Popup Dialog 如何:在弹出对话框中显示非持久化对象列表
  2. How to: Apply Attributes to Entity Properties when Using Model First 如何:在ModelFirst时将属性应用于实体属性
  3. druid链接数据库
  4. 图片切换器(ImageSwitcher)的功能与用法
  5. Vue之富文本tinymce爬坑录
  6. ABP入门教程0 - 目录
  7. 【Spring Cloud】Spring Cloud Config 实现分布式配置中心
  8. Error: Unable to establish IPMI v2 / RMCP+ session
  9. Mac中 pip3 install mysqlclient 报错
  10. 电池中的NTC功能是什么?【转】