zoukankan      html  css  js  c++  java
  • (拓扑排序+并查集)HDU

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811


    题意:有个很多关系,现在需要产生一个名单,有的人比有的人牛逼,有的人没有的人牛逼,有的人一样牛逼,现在需要通过牛逼程度排名,如果1比2牛逼,1的排名就比2前,如果1和2一样牛逼,就比两个人的人品,人品好的人排前面。

    现在有三种情况:

    1、正确

    2、矛盾

    3、无法确定


    分析:

    这里其他方面还是比较简单。首先确定三种情况的发生条件:

    矛盾--存在环,也就是在toposort之后,没有把所有的点全都访问到。

    无法确定--只要存在一次入度为0的点不止一个,那么这个拓扑序就不唯一,所以无法确定。


    代码:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <string>
      4 #include <vector>
      5 #include <map>
      6 #include <set>
      7 #include <queue>
      8 #include <cstring>
      9 #include <algorithm>
     10 
     11 using namespace std;
     12 
     13 
     14 typedef long long ll;
     15 typedef unsigned long long ull;
     16 #define inf (0x3f3f3f3f)
     17 #define lnf (0x3f3f3f3f3f3f3f3f)
     18 #define eps (1e-8)
     19 int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1 ;}
     20 
     21 //-------------------------------------------------
     22 
     23 
     24 const int maxn=10010;
     25 vector<int> edge[maxn];
     26 
     27 int indu[maxn];
     28 int par[maxn];
     29 int ranks[maxn];
     30 int u[maxn],v[maxn];
     31 int n,m;
     32 int rn;
     33 char op[maxn][3];
     34 
     35 void init(){
     36     for(int i=0;i<n;i++){
     37         par[i]=i;
     38         ranks[i]=0;
     39         edge[i].clear();
     40     }
     41     memset(indu,0,sizeof(indu));
     42 }
     43 
     44 int findx(int x){
     45     if(par[x]==x)return x;
     46     else return par[x]=findx(par[x]);
     47 }
     48 
     49 bool unite(int x,int y){
     50     x=findx(x);
     51     y=findx(y);
     52     if(x==y)return false;
     53     if(ranks[x]>ranks[y]){
     54         par[y]=x;
     55     }
     56     else{
     57         if(ranks[x]==ranks[y]){
     58             ranks[y]++;
     59         }
     60         par[x]=y;
     61     }
     62     return true;
     63 }
     64 
     65 
     66 bool toposort(){
     67     queue<int> q;
     68     for(int i=0;i<n;i++){
     69         if(indu[i]==0&&i==findx(i)){
     70             indu[i]--;
     71             q.push(i);
     72         }
     73     }
     74     bool allon=false;
     75 
     76     while(!q.empty()){
     77         if(q.size()>1)allon=true;
     78         int u=q.front();
     79         q.pop();
     80         rn--;
     81         for(int i=0;i<edge[u].size();i++){
     82             indu[edge[u][i]]--;
     83             if(indu[edge[u][i]]==0){
     84                 q.push(edge[u][i]);
     85             }
     86         }
     87     }
     88     return allon;
     89 }
     90 
     91 
     92 void solve(){
     93     while(~scanf("%d%d",&n,&m)){
     94         init();
     95         rn=n;
     96         for(int i=0;i<m;i++){
     97             scanf("%d%s%d",&u[i],op[i],&v[i]);
     98             if(op[i][0]=='='){
     99                 if(unite(u[i],v[i])){
    100                     rn--;
    101                 }
    102             }
    103         }
    104         for(int i=0;i<m;i++){
    105             if(op[i][0]!='='){
    106                 int x=findx(u[i]);
    107                 int y=findx(v[i]);
    108                 if(op[i][0]=='>'){
    109                     edge[x].push_back(y);
    110                     indu[y]++;
    111                 }
    112                 else{
    113                     edge[y].push_back(x);
    114                     indu[x]++;
    115                 }
    116             }
    117         }
    118         bool allon=toposort();
    119         if(rn>0){
    120             puts("CONFLICT");
    121         }        
    122         else if(allon){
    123             puts("UNCERTAIN");
    124         }
    125         else{
    126             puts("OK");
    127         }
    128     }
    129 
    130 }
    131 
    132 
    133 
    134 int main(){
    135 
    136 #ifndef ONLINE_JUDGE
    137     freopen("1.in","r",stdin);
    138     //freopen("1.out","w",stdout);
    139 #endif
    140 
    141     solve();
    142 }
  • 相关阅读:
    Android 网络框架学习之Retrofit,androidretrofit
    Android 应用APP加入聊天功能
    Mybatis 数据库物理分页插件 PageHelper
    mvn常用命令
    执行第一maven用例出错:Unknown lifecycle phase "complile".
    Mybatis分页插件
    ViewHolder模式超简洁写法
    android网络框架Retrofit 同步异步
    严苛模式(StrictMode)
    使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包
  • 原文地址:https://www.cnblogs.com/tak-fate/p/5983106.html
Copyright © 2011-2022 走看看