HDU
来源:互联网 发布:炫浪网络社区百合 编辑:程序博客网 时间:2024/06/05 20:53
题解:将相等的点并到一个集合里面,然后拓扑排序如果存在环就是矛盾,如果一个队列里面存在多个数就是,不确定,其他都是OK
#include<iostream>#include<cstdio>#include<cstring>#include<set>#include<queue>#include<vector>#include<algorithm>using namespace std;const int mx = 1e4+5;struct node{ int v; int next;}E[mx<<2];int head[mx];int in[mx];int tot;int vis[mx];int p[mx];queue<int>q;vector<int>g[mx];void add(int u,int v){ tot++; E[tot].v = v; E[tot].next = head[u]; head[u] = tot;}int find(int x){ return p[x] == x?x:p[x] = find(p[x]);}int main(){ int a,b; char c; int n,m; while(scanf("%d%d",&n,&m)!=EOF){ memset(head,0,sizeof(head)); memset(in,0,sizeof(in)); memset(vis,0,sizeof(vis)); tot = 0; for(int i = 0; i < n; i++){ p[i] = i; g[i].clear(); } int sum = n; for(int i = 1; i <= m; i++){ scanf("%d %c %d",&a,&c,&b); if(c=='<') add(b,a); else if(c=='>') add(a,b); else { a = find(a); b = find(b); if(a!=b){ p[b] = a; sum--; } } } for(int i = 0; i < n; i++){ int x = find(i); for(int j = head[i]; j; j = E[j].next){ int v = find(E[j].v); g[x].push_back(v); in[v]++; } } int cnt = 0; int ok = 1; for(int u = 0; u < n; u++) if(!in[find(u)]){ if(!vis[find(u)]){ q.push(find(u)); cnt++; vis[find(u)] = 1; } } while(!q.empty()){ int u = q.front(); q.pop(); if(!q.empty()) ok = 0; for(auto v: g[u]){ in[v]--; if(!in[v]){ cnt++; q.push(v); } } } //cout<<cnt<<endl; //cout<<sum<<endl; if(cnt!=sum) puts("CONFLICT"); else if(ok == 0) puts("UNCERTAIN"); else puts("OK"); } return 0;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 顺序表的基本操作
- idea编译问题
- block,inline和inline-block概念和区别
- Ubuntu下安装Redis数据库,与基于Redis数据库搭建主从服务器
- OpenCV之将图像拼装成视频
- HDU
- 判断程序是否算稳的小程序
- 2017年8月12日提高组T2 YMW的数学题
- js跨域时IE9多次请求问题
- 稻草人总结之Image-Loader加载图片
- php中 iconv 函数使用方法
- 发布到google Play的app搜索不到问题的解决
- canvas中如何设置渐变色
- Java实现简单排序——冒泡、选择、插入、奇偶排序