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.很容易想到在线做法,使用可持 ...
随机推荐
- 孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块
孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块 (完整学习过程屏幕记录视频地址在文末) 由于本身tesseract模块针对普通的验证码图片的识别率并不高 ...
- logisitic回归
线性回归目的是找到一条直线(或者超平面)尽可能地接近所有的训练数据点,而对数几率回归的目的是找到一条直线(或者超平面)尽可能地分开两种不同类别的数据点. 对数几率回归感觉更像是一个分类问题.https ...
- Multi-task Correlation Particle Filter for Robust Object Tracking--论文随笔
摘要:在这篇论文中,作者提出一种鲁棒视觉跟踪的多任务相关粒子滤波琪跟踪算法(MCPF).作者首先向我们展示了多任务相关滤波器,该滤波器在训练滤波器模板的时候可以学习不同特征之间的联系.本文提出的MCP ...
- Docker: 如何修改 Docker 的镜像存储位置
我用的阿里云的服务器, 但是系统盘只有20G, 默认 Docker 的镜像文件是安装在/var/lib 目录下的, 这样的话我根本装不了太多的镜像... 这个必须得改改... 搜了下, 解决方案如下: ...
- 1.linux环境配置
首先说一下,这里是虚拟机环境. 1.用vbox安装centos6.8-mini 注意不要使用复制的方式安装,复制的虚拟机网络不通 安装如下: 主机 ip 角色 内存 hadoop1 192.168.0 ...
- M2迭代分数分配
M2中仍然依据每个成员的工作量,贡献度分配相应得分. 成员 得分 申开亮 25 王皓南 24 许晋 21 黄玉冰 20 王宇杰 18 吴润凡 17 巴丹益昔 15
- ZOJ 1539 L-Lot
https://vjudge.net/contest/67836#problem/L Out of N soldiers, standing in one line, it is required t ...
- Mysql8 忘记Root密码(转)
第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1.2 在 [mysqld]最后加上如下语句 并保持退出文件: skip-grant-tables 1.3 重启mysql服务 ...
- set(gcf,'DoubleBuffer','on')
设置的目的是为了防止在不断循环画动画的时候会产生闪烁的现象,而这样便不会了.在动画的制作比较常用.
- 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路
题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...