/*
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拓扑排序和并查集的更多相关文章

  1. Rank of Tetris 杭电 拓扑排序加并查集

    自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...

  2. ZOJ 3521 Fairy Wars oj错误题目,计算几何,尺取法,排序二叉树,并查集 难度:2

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3521 ATTENTION:如果用long long 减小误差,这道题只能用 ...

  3. Luogu1155 NOIP2008双栈排序(并查集)

    两个位置i和j上的元素不能被放进同一个栈的充要条件显然是存在k使i<j<k且ak<ai<aj.由此在保证合法的情况下贪心地放就是正确的了. 至于如何判断,可以记一下后缀最小值, ...

  4. 并查集+拓扑排序 赛码 1009 Exploration

    题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...

  5. hdu1811 Rank of Tetris 拓扑排序+并查集

    这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...

  6. Codeforces 336D Dima and Trap Graph 并查集

    Dima and Trap Graph 枚举区间的左端点, 然后那些左端点比枚举的左端点小的都按右端点排序然后并查集去check #include<bits/stdc++.h> #defi ...

  7. 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的距离 ...

  8. HDU1598 并查集+贪心

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  9. [NOI2018]归程(可持久化并查集,Kruskal重构树)

    解法一: 1.首先想到离线做法:将边和询问从大到小排序,并查集维护连通块以及每个连通块中所有点到1号点的最短距离.$O(n\log n)$ 配合暴力等可以拿到75分. 2.很容易想到在线做法,使用可持 ...

随机推荐

  1. Python数据分析实战-Boston Public Schools GEO数据分析-Part1

    项目目标: Boston Public Schools Geo数据是来自于Boston地区的公共学校的数据,具体描述了学校的坐标,名字,类型等.基于此数据,我们可以学习一些基本的Python数据分析的 ...

  2. NTP错误总结

    Ntp错误总结 解决ntp的错误 no server suitable for synchronization found 当用ntpdate -d 来查询时会发现导致 no server suita ...

  3. jQuery实现仿京东商城图片放大镜

    效果图: 不废话直接上代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  4. Python中的相对导入语法

    Python中支持相对导入语法,即可以相对于某一个package进行导入,具体语法如下: # 导入"./dir2/spam.py", .表示当前目录 from .dir2 impo ...

  5. Python实用技巧

    1.改变工作目录 import os os.chdir('C:/Users/Mr.Zhao') 2.搜索制定目录下的文件 1 import glob 2 glob.glob('C:/User/Mr.Z ...

  6. Khan Academy

    Khan Academy是一个免费的学院. 致力于教育改革. 百度百科:ohn Resig 百度百科有记者采访,采访内容比较有意思.

  7. iOS单利创建的方法

    我们在使用单例的时候有两种方法@synchronized,GCD,往往人们使用@synchronized,但是推荐使用GCD: 第一种(@synchronized): + (id)sharedInst ...

  8. WinForm连续点击按钮只打开一次窗体

    许多朋友,学习C#时,制作WinForm小程序总会有一个问题,如果我们在父窗体设置的是点击一个按钮,打开一个子窗体,连续点击总会连续出现一样窗体,可是我们有时只想打开一次窗体,怎么办? 呵呵,我来方法 ...

  9. 3ds Max学习日记(三)

      今天把第三章搞完了,学的是样条线(splines)建模的一些操作.不过实习又有新任务了,得去研究一下如何将单张图片转化为三维模型(我擦,这神马操作),所以可能没有那么多时间愉快地与3ds max玩 ...

  10. Hadoop出现错误:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable,解决方案

    安装Hadoop的时候直接用的bin版本,根据教程安装好之后运行的时候发现出现了:WARN util.NativeCodeLoader: Unable to load native-hadoop li ...