POI2008 CLO-Toll
2024-09-05 13:47:10
[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;
}
最新文章
- Ubuntu搭建lnmp环境
- AngularJS API之$injector ---- 依赖注入
- table表格制作
- 使用perl实现scp批量分发
- 《SAS编程与数据挖掘商业案例》学习笔记之十七
- java编程小技巧
- WebStorm开发Nodejs环境搭建,包括破解最新的WebStom11破解
- 支持各种特殊字符的 CSV 解析类 (.net 实现)(C#读写CSV文件)
- 记录一则ASM实例阻塞,rbal进程异常的案例
- mvc项目远程发布到windows server服务器
- Similarity measure
- Servlet的创建二以及生命周期
- 机器学习基石笔记:13 Hazard of Overfitting
- java把list分成几个list
- doubleclick adx note
- 将MYSQL的GBK数据库转成_UTF-8数据库的简便方法
- 数据库以及pymysql
- 用Beautiful Soup解析html源码
- selenium除错
- beta阶段——项目复审
热门文章
- How to: Display a List of Non-Persistent Objects in a Popup Dialog 如何:在弹出对话框中显示非持久化对象列表
- How to: Apply Attributes to Entity Properties when Using Model First 如何:在ModelFirst时将属性应用于实体属性
- druid链接数据库
- 图片切换器(ImageSwitcher)的功能与用法
- Vue之富文本tinymce爬坑录
- ABP入门教程0 - 目录
- 【Spring Cloud】Spring Cloud Config 实现分布式配置中心
- Error: Unable to establish IPMI v2 / RMCP+ session
- Mac中 pip3 install mysqlclient 报错
- 电池中的NTC功能是什么?【转】