hdu 1811拓扑排序+并查集(容器实现)

原创 2013年12月03日 17:06:05

http://www.cnblogs.com/newpanderking/archive/2012/10/18/2729566.html

#include<stdio.h>

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N=11000;
vector<int>link[N];//容器来是模拟邻接表
int pre[N],a[N],b[N],indegree[N],n,m,sum;
char c[N];
int find(int x) {//路径压缩
if(x!=pre[x])
pre[x]=find(pre[x]);
return pre[x];
}
int Union(int x,int y) {//合并
int f1=find(x);
int f2=find(y);
if(f1==f2)
return 0;
pre[f1]=f2;
return 1;
}
void bfs() {
       queue<int>q;
  int i,flag;
  for(i=0;i<n;i++) {
  if(find(i)==i&&indegree[i]==0)//将所有第一名的代表放进队列
  q.push(i);
  }   flag=0;
  while(!q.empty()) {//队列实现拓扑排序
  int cur=q.front();
  if(q.size()>1)flag=1;//信息已经不完整了,但是还有可能含有冲突
  q.pop();////和上面的q.size()的判断的顺序不能交换
  for(i=0;i<link[cur].size();i++)
  if(--indegree[link[cur][i]]==0)
  q.push(link[cur][i]);
  sum--;
  }
  if(sum>0)//冲突优先
  printf("CONFLICT\n");
  else
  if(flag==1)//没有冲突了看信息是否完整
  printf("UNCERTAIN\n");
  else
  printf("OK\n");
}
int main() {
int i,f1,f2;
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=0;i<n;i++) {//初始化
link[i].clear();
pre[i]=i;
}
sum=n;
for(i=0;i<m;i++) {
scanf("%d %c%d",&a[i],&c[i],&b[i]);
if(c[i]=='=') 
if(Union(a[i],b[i]))
sum--;
}
memset(indegree,0,sizeof(indegree));//入度
for(i=0;i<m;i++)
if(c[i]!='=') {
f1=find(a[i]);
f2=find(b[i]);
if(c[i]=='>') {
link[f1].push_back(f2);
indegree[f2]++;
}
else {
link[f2].push_back(f1);
indegree[f1]++;
}
}
bfs();
}
return 0;
}











版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 1811 并查集+拓扑排序

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811 中文题。检查所给的关系是否矛盾,或者不唯一,还是正确的。 背景:WA了好久。。。。之前思路一直不...
  • liujc_
  • liujc_
  • 2015年04月23日 10:55
  • 518

hdu 1811 拓扑排序+并查集判断

拓扑排序的两个性质:①如果一次入队入度为零的点大于1则说明拓扑排序序列不唯一②如果排序的总个数小于给定的个数,则说明存在回路#include #include #include #include #i...
  • last_xuanshen
  • last_xuanshen
  • 2017年06月27日 15:00
  • 76

hdu 1811(拓扑排序+并查集)

解题思路: 拓扑排序的两个性质: ①如果一次入队入度为零的点大于1则说明拓扑排序序列不唯一 ②如果排序的总个数小于给定的个数,则说明存在回路 可以先把"="的两个数用并查集放在...
  • hexianhao
  • hexianhao
  • 2016年05月11日 23:27
  • 170

hdu 1811 拓扑排序+并查集

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...
  • lois_123
  • lois_123
  • 2015年07月11日 11:16
  • 193

hdu 1811(拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • martinue
  • martinue
  • 2016年03月09日 13:05
  • 464

hdu 1811 拓扑排序,查并集

先鄙视一下自己哎~~忘初始化一个数组结果一直wa对照别人代码找了好久~~~ 这是一道很好的题,考验自己的基本功~~先是用邻接矩阵结果内存超出~~~~写邻接表花了好一阵~~~ 一下代码: #inc...
  • JustSteps
  • JustSteps
  • 2013年01月24日 21:47
  • 971

hdu 1811 并查集+拓扑排序

Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。 为了更好的符合那些爱好者的喜好,Lele又想了一个...
  • huyiqun753
  • huyiqun753
  • 2016年03月09日 16:04
  • 150

hdu 1811 拓扑排序和并查集

Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。 为了更好的符合那些爱好者的喜好,Lele又想了...
  • u013573047
  • u013573047
  • 2014年04月25日 17:53
  • 388

hdu 1811 拓扑排序+并查集

首先用并查集将“=”的元素合并成一个,然后用拓扑排序判断能否排序#include #include #include #include #include #include using na...
  • hzh_0000
  • hzh_0000
  • 2015年06月18日 01:19
  • 293

hdu 1811 并查集+拓扑排序

链接 http://acm.hdu.edu.cn/showproblem.php?pid=1811
  • NLSQQ
  • NLSQQ
  • 2016年07月31日 10:19
  • 78
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 1811拓扑排序+并查集(容器实现)
举报原因:
原因补充:

(最多只允许输入30个字)