HDU 1881
思路:一开始以为rating相同的点就直接比较rp然后建图,后来想想不对,因为这样发现不了冲突。后来一想对于rating相同的点可以不用排序,因为对于这些点,他们的rp必然不相同,也就是说在这些点的内部必然存在唯一的且合理的排序,因此只需将要将这些点合并成一个点即可,需要用到并查集的知识。
把所有点按上述方法处理后就会得到一些点(暂且称为“有效点”),对于这些有效点再进行拓扑排序即可。
冲突情形:到最后存在环,或者出现a > b,b > c 且 c >a;
不确定情形:同一层中不止一个点入度为0;
确定情形:除以上两种情形;
#include<stdio.h>
#include<string.h>
typedef struct
{
int to;
int next;
}EdgeNode;
int cnt;
char str[6];
EdgeNode Edge[20005];
int father[10005],depth[10005];
int L[10005],M[10005],R[10005];
int head[10005],indegree[10005];
int vis[10005],node[10005],temp[10005];
void init(int n)
{
int i;
cnt = 0;
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
memset(indegree,0,sizeof(indegree));
for(i = 0;i < n;i ++)
{
father[i] = i;
depth[i] = 0;
}
} int find(int x)
{
if(x == father[x])
return x;
return father[x] = find(father[x]);
} void uint(int x,int y)
{
x = find(x);
y = find(y);
if(x == y)
return ;
if(depth[x] < depth[y])
father[x] = y;
else
{
if(depth[x] > depth[y])
father[y] = x;
else
{
father[x] = y;
depth[y]++;
}
}
return ;
} void add_edge(int n,int m)
{
Edge[cnt].to = m;
Edge[cnt].next = head[n];
head[n] = cnt++;
} int main(void)
{
int a,b,n,m,i,j,k;
int sum,flag_U,flag_C;
while(~scanf("%d %d",&n,&m))
{
init(n);
flag_U = flag_C = 0;
for(i = 1;i <= m;i ++)
{
scanf("%d %c %d",&L[i],&M[i],&R[i]);
if(M[i] == '=')
{
uint(L[i],R[i]);
}
}
for(i = 1;i <= m;i ++)
{
if(M[i] == '=')
continue ;
a = find(L[i]);
b = find(R[i]);
if(a == b)
{
flag_C = 1;
break ;
}
else
{
if(M[i] == '>')
{
add_edge(b+1,a+1);
indegree[a+1]++;
}
else
{
add_edge(a+1,b+1);
indegree[b+1]++;
}
}
}
for(i = 1;i <= n;i ++)
{
sum = 0;
for(j = 1;j <= n;j ++)
{
if(indegree[j] == 0 && vis[j] == 0 && father[j-1] == j-1)
temp[sum++] = j;
}
if(sum > 1)
flag_U = 1;
for(j = 0;j < sum;j ++)
{
vis[temp[j]] = 1;
for(k = head[temp[j]];k != -1;k = Edge[k].next)
{
if(!vis[Edge[k].to])
indegree[Edge[k].to]--;
}
}
}
for(i = 1;i <= n;i ++)
{
if(indegree[i] && father[i-1] == i-1)
{
flag_C = 1;
break ;
}
}
if(!(flag_C+flag_U))
printf("OK\n");
if(flag_C)
printf("CONFLICT\n");
if(flag_U && !flag_C)
printf("UNCERTAIN\n");
}
return 0;
}
HDU 1881的更多相关文章
- HDU 5643 King's Game 打表
King's Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5643 Description In order to remember hi ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 3791二叉搜索树解题(解题报告)
1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...
随机推荐
- Javascript中的迭代、归并方法
迭代方法 在Javascript中迭代方法个人觉得尤为重要,在很多时候都会有实际上的需求,javascript提供了5个迭代方法来供我们操作,它们分别为: every() 对数组中的每一个项运用给定的 ...
- mysql查询语句分析 explain用法
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了,如: explai ...
- VC++2010添加菜单
1 资源视图下面右键添加资源 选择menu 2 创建你想要的menu 3 找到CDialog::OnInitDialog();在后面添加代码. CMenu menu; menu.LoadMenu ...
- json在线校验
弄了一个在线校验,清爽无广告,欢迎大家收藏 http://www.zhhoney.com/
- JAVA String 类
java String类中的常用方法:public char charAt(int index)返回字符串中第index个字符:public int length()返回字符串的长度:public i ...
- entity framework in mysql
To start using Entity Framework 6 and Visual Studio 2013 is necessary to install MySQL for Visual St ...
- protues仿真 51点亮点阵
电路图 程序 /*============================== 点亮点阵心形 ================================*/ #include <REGX5 ...
- CSS水平、垂直居中小结
我们在实际工作中经常会遇到需要水平居中或者垂直居中的场景,今天我们就来看一下如何设置水平居中和垂直居中. 首先来看水平居中. 一.水平居中设置-行内元素. 如果被设置元素为文本.图片等行内元素时,水平 ...
- js构造函数传参
1.直接传参并用this关键字初始化属性 function Person(name,age,learn){ this.name = name; this.age = age; this.learn = ...
- COOKIE之安全设置漫谈
一.标题:COOKIE之安全设置漫谈 副标:httponly属性和secure属性解析 二.引言 经常有看到XSS跨站脚本攻击窃取cookie案例,修复方案是有httponly.今天写出来倒腾下... ...