ACM1811拓扑排序和并查集
/*
ACM1811 可以利用拓扑排序和并查集解决,主要方式是利用并查集在输入数据的时候将所有相等的点合并
然后将处理完的数据统一按照一个符号方向连接成有向线段,利用的是邻接矩阵;接下来把每条边都进行履历
如果出现conflict,那么就会在去除所有入度的时候无法找到新的零入度点,那么就会似的point无法减到零,
表示有conflict,如果出现uncertain,那么就会在一次寻找新的零入度点时能找到多个点,导致在队列中保存
多个数据 ;
*/
#include<iostream>
#include<queue>
using namespace std;
class EDGE
{
public:
int from,to;
char sign;
};
class WAY
{
public:
int from,to,next;
};
class DEAL
{
public:
DEAL(int n,int m)
{
edge=new EDGE[m];
way=new WAY[m];
father=new int[n];
head=new int[n];
into=new int[n];
for(int i=;i<n;i++)
{
father[i]=i;head[i]=-;
into[i]=;
}
number=n;
point=n;
side=m;
count=;
certain=true;
conflict=false;
}
~DEAL()
{
delete []edge;
delete []father;
delete []way;
delete []head;
delete []into;
}
void Input()
{
for(int i=;i<side;i++)
{
cin>>edge[i].from>>edge[i].sign>>edge[i].to;
if(edge[i].sign=='=')
{
int fa=FindFather(edge[i].from);
int fb=FindFather(edge[i].to);
Union(fa,fb);
point--;
}
}
}
void Preprocess()
{
for(int i=;i<side;i++)
{
if(edge[i].sign=='=')continue;
int fa=FindFather(edge[i].from);
int fb=FindFather(edge[i].to);
if(fa==fb)conflict=true;
if(edge[i].sign=='<')
Merge(fb,fa);
else if(edge[i].sign=='>')
Merge(fa,fb);
}
}
void Toposort()
{
for(int i=;i<number;i++)
{
if(into[i]==&&father[i]==i)//是头节点
q.push(i);
}
while(!q.empty())
{
int l=q.front();
q.pop();
point--;
if(!q.empty())certain=false;
int v;
for(v=head[l];v!=-;v=way[v].next)
{
int u=way[v].to;
into[u]--;
if(!into[u])q.push(u);
}
}
}
void Output()
{
if(point>||conflict)
cout<<"CONFLICT"<<endl;
else if(!certain)cout<<"UNCERTAIN"<<endl;
else cout<<"OK"<<endl;
}
int FindFather(int x)
{
if(x==father[x])return x;
return father[x]=FindFather(father[x]);
}
void Union(int x,int y)
{
if(x!=y)father[y]=x;//后面跟着前面
}
void Merge(int x,int y)
{
way[count].from=x;
way[count].to=y;
way[count].next=head[x];
into[y]++;
head[x]=count++;
}
private:
queue<int>q;
int number,side,point,count;
EDGE *edge;
WAY *way;
int *father,*head,*into;
bool certain,conflict;
};
int n,m;
int main()
{
while(cin>>n>>m)
{
DEAL ob(n,m);
ob.Input();
ob.Preprocess();
ob.Toposort();
ob.Output();
}
return ;
}
ACM1811拓扑排序和并查集的更多相关文章
- Rank of Tetris 杭电 拓扑排序加并查集
自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...
- ZOJ 3521 Fairy Wars oj错误题目,计算几何,尺取法,排序二叉树,并查集 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3521 ATTENTION:如果用long long 减小误差,这道题只能用 ...
- Luogu1155 NOIP2008双栈排序(并查集)
两个位置i和j上的元素不能被放进同一个栈的充要条件显然是存在k使i<j<k且ak<ai<aj.由此在保证合法的情况下贪心地放就是正确的了. 至于如何判断,可以记一下后缀最小值, ...
- 并查集+拓扑排序 赛码 1009 Exploration
题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...
- hdu1811 Rank of Tetris 拓扑排序+并查集
这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...
- Codeforces 336D Dima and Trap Graph 并查集
Dima and Trap Graph 枚举区间的左端点, 然后那些左端点比枚举的左端点小的都按右端点排序然后并查集去check #include<bits/stdc++.h> #defi ...
- BZOJ.1576.[Usaco2009 Jan]安全路经Travel(树形DP 并查集)
题目链接 BZOJ 洛谷 先求最短路树.考虑每一条非树边(u,v,len),设w=LCA(u,v),这条边会对w->v上的点x(x!=w)有dis[u]+dis[v]-dis[x]+len的距离 ...
- HDU1598 并查集+贪心
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- [NOI2018]归程(可持久化并查集,Kruskal重构树)
解法一: 1.首先想到离线做法:将边和询问从大到小排序,并查集维护连通块以及每个连通块中所有点到1号点的最短距离.$O(n\log n)$ 配合暴力等可以拿到75分. 2.很容易想到在线做法,使用可持 ...
随机推荐
- 更新字典 (Updating a Dictionary,UVa12504)
题目描述: 解题思路: 1.根据:和,获得字符串 2.使用两个map进行比较: #include <iostream> #include <algorithm> #includ ...
- 【转】unity 热更新思路和实现
声明:本文介绍的热更新方案是我在网上搜索到的,然后自己修改了一下,相当于是借鉴了别人的思路,加工成了自己的,在此感谢无私分享经验的朋友们. 想要使用热更新技术,需要规划设计好资源比较策略,资源版本,确 ...
- (原) MaterialEditor部- UmateriaEditor中 Node编译过程和使用(3)修正
@author: 白袍小道 转载说明原处,爱护劳动 插件同步在GITHUB: DaoZhang_XDZ 说明 1.本篇是接着-----(原) MaterialEditor部- Umat ...
- android课程第一节(TextView控件使用)
TextView控件使用 一.TextView基本使用(创建方式) 1.在程序中创建TextView对象 如下代码: @Override protected void onCreate(Bundle ...
- js学习之正则表达式
js学习之正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模式 一:语法 ...
- Python练习—函数
1.编写函数f(n),实现输入n的值,求出n的阶乘.然后调用此函数计算1! +2!+3!+……10!的结果,输出到屏幕上. def f(n): count = 1; for i in range(1, ...
- Thunder团队第一周 - Scrum会议7
Scrum会议7 小组名称:Thunder 项目名称:爱阅app Scrum Master:宋雨 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传康 ...
- Thunder团队第一周 - Scrum会议3
Scrum会议3 小组名称:Thunder 项目名称:在线考试系统 Scrum Master:杨梓瑞 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李 ...
- sql查询 同一个字段下另一个字段个数
select seriesid , count(reportid) from reportsystem group by seriesidhaving count(reportid) > 1
- Spring学习(二)—— java的动态代理机制
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...