题意:给你3种关系 A=B,A>B,A<B 问是否排名方式唯一,或者存在矛盾


1.读入数据先处理 =号 用并查集的祖先作为代表元素,其他儿子节点都等于跟这个点重叠。 再读入 ‘<’ ‘>’ 来建图进行拓扑排序

2.将所有入度为0的点加入队列,再从队列中取出一个点,对其所连的边的入度进行-1,如果使入度=0则加入队列,直至队列为空

3.如果进入队列的点
小于 总点数(非N,N-重点) 则有矛盾

如果有队列中元素>=2的时刻
则证明不存在唯一的排名方式

其余
OK;

代码如下:

/*
WA1 调试数据
2 2
0 = 1
0 = 1
错误输出 CONFLIET
正确输出 OK 错误原因 if(tot<N) printf("CONFLICT\n"); 忘记了重点(合并的点),所以总共要遍历的点少于N
*/
//Warning 虽然这里没必要 不过还是要的记得清空队列
//结果 Run ID Submit Time Judge Status Pro.ID Exe.Time Exe.Memory Code Len. Language Author
//结果 13306745 2015-03-31 21:40:45 Accepted 1811 31MS 1972K 2378 B C++ ZHOU #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include<queue>
#define oo 0x13131313
const int maxn=10005;
int N,M; struct fa
{
int a,b;
char c;
};
fa A[4*maxn];
struct Edge{
int to;
Edge *next;
};
struct Node{
int num;
Edge *first;
};
Edge E[maxn*4],*EE=E+1;
Node Graph[maxn];
int father[maxn];
using namespace std;
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void Union(int a,int b)
{
int aa=find(a),bb=find(b);
if(aa!=bb) father[aa]=bb;
}
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
void Link(int u,int v)
{
EE->to=v,EE->next=Graph[u].first,Graph[u].first=EE++;
Graph[v].num++;
}
void CLEAR()
{
memset(Graph,0,sizeof(Graph));
EE=E+1;
for(int i=0;i<=maxn-1;i++)
father[i]=i;
}
void input()
{
CLEAR();
for(int i=1;i<=M;i++)
{
scanf("%d %c %d\n",&A[i].a,&A[i].c,&A[i].b);
if(A[i].c=='=') Union(A[i].a,A[i].b);
}
for(int i=1;i<=M;i++)
{
if(A[i].c=='<') Link(find(A[i].a),find(A[i].b));
else if(A[i].c=='>') Link(find(A[i].b),find(A[i].a));
}
}
void solve()
{ int ok=1;
int tot=0;
int kk=0;
queue <int> Q;
while(!Q.empty()) Q.pop();
for(int i=0;i<N;i++)
if(father[i]==i)
{
kk++;
if(Graph[i].num==0)
Q.push(i);
}
while(!Q.empty())
{
if(Q.size()>=2) ok=0;
int t=Q.front();Q.pop();tot++;
for(Edge *p=Graph[t].first;p;p=p->next)
{
Graph[p->to].num--;
if(Graph[p->to].num==0) Q.push(p->to);
}
} if(tot<kk) printf("CONFLICT\n");
else if(ok==0) printf("UNCERTAIN\n");
else printf("OK\n");
}
int main()
{
// init();
while(cin>>N>>M)
{
input();
solve();
}
return 0;
}

【并查集+拓扑排序】【HDU1811】【Rank of Tetris】的更多相关文章

  1. HDU 1811:Rank of Tetris(并查集+拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

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

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

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

    #include <stdio.h> #include <string.h> #include <vector> #include <queue> us ...

  4. HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. HDU1811 并查集+拓扑排序

    题目大意: 判断是否能根据给定的规则将这一串数字准确排序出来 我们用小的数指向大的数 对于相等的情况下,将二者合并到同一个并查集中,最后抽象出来的图上面的每一个点都应该代表并查集的标号 #includ ...

  6. hdu 1811 Rank of Tetris (并查集+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. hdu 1811Rank of Tetris (并查集 + 拓扑排序)

    /* 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B ...

  8. Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)

    D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: =  的情况我们用并查集把他们扔到一个集合,然后根据 > ...

  9. Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序

    https://codeforces.com/contest/1131/problem/D 题意 给你一个n*m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[] ...

随机推荐

  1. Multiscale Combinatorial Grouping 学习和理解源代码(一)

    目标探测由于所做的最新研究.因此,这一领域的一般阅读文章.发现这篇文章,效果是比较新的比较好.在如此仔细研究.贴纸和共享.下面已经发布若干个连续的,分别对论文和代码进行大致地介绍,最后依据自己的实验对 ...

  2. Unity uGUI 登录及注册功能

    上次我们已经完成了登录界面的模拟功能,今天咱们把上次没做完的继续完善下!那么废话少说直接开始吧! PS:本次完善的功能有: 1,增加对数据库的操作. 2,使用了MD5Key值加密 3,完善登录和组测功 ...

  3. 【降维解法:最大字段和->最大子矩阵和->最终版最大子长方体和】【UVA10755】Garbage Heap

    突然感觉刷完这一套专题后 码力有了质的飞跃,fighting 努力会有结果! 最大字段和是一个很经典的问题 O(n)算法 而对于最大子矩阵和 可以思考一个这样的想法 枚举上下边界i,j把i到j这一段的 ...

  4. 【贪心】【Uva11729】 Commando War

    你有n个部下,每个部下需要完成一项任务.第i个部下需要你花Bi分钟交待任务,然后他会立刻独立地.无间断地执行Ji分钟后完成任务.你需要选择交待任务的顺序,使得所有任务尽早执行完毕(即最后一个执行完的任 ...

  5. log4j2j配置

    maven依赖 <properties> <sl4j.version>1.7.7</sl4j.version> <log4j2.version>2.1& ...

  6. 五、MP3文件认识上的几个误区

    1.每帧播放时长都为26ms? 很多博客和文章都提到,Mp3文件每个帧的播放时长(Frame_PlayingTime)是26ms,这个结论是错误的.公式应该是这样的: 一个帧的播放时长=一个帧的采样个 ...

  7. angular $location常用方法使用

    $location提供了一些常用的操作和获取地址栏里的地址的方法. <script type="text/javascript"> angular.module('ap ...

  8. 在SQL中修改数据库名称

    假设SQL Server 2008中有个数据库test,现在要将其改名为zhy步骤:(1) 分离数据库:打开management studio,找到test数据库-->右键-->任务--& ...

  9. Mac系统杂项 (持续更新)

    一.调整LaunchPad的图标显示列数和行数 .调整每一列显示图标数量.在我的电脑上(1366 * 768),每列7个个人觉得比较不错 defaults write com.apple.dock s ...

  10. Word Search II

    Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...