zoukankan      html  css  js  c++  java
  • Sorting It All Out POJ

    题意:给N个字母,和M个偏序关系 求一个可确定的全序,可确定是指没有其他的可能例如A>B D>B 那么有ADB DAB两种,这就是不可确定的
    其中,M个偏序关系可以看做是一个一个按时间给出的,如果还没给完就已经满足条件了,后面的可以不用管

    题解:拓扑水题,直接用拓扑排序暴力 其中 如果途中 冲突 那么即使后面添加了也不能改变冲突 如果前面成功了那就不用管后面了直接continue 其中
    拓扑判断的时候如果存在多个0度点 那么就不可确定 如果排序完比n个点少,那么确定不了一个全序,分类讨论

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int seq[50];
    int n,m;
    int err,ans;
    struct Node{
    int pos,next;
    }edge[5000];
    int neigh[500];
    int queue[50000];
    int cur,indegree[50];
    int front=0,rear=0;
    int toposort(){
    int indge[50];
    bool ok=0;
    for(int i=0;i<n;i++){
    indge[i]=indegree[i];
    if(indge[i]==0)queue[rear++]=i;
    }
    int k=0;
    while(front!=rear){
    if(front+1<rear)ok=1;
    int temp=queue[front++];
    seq[k++]=temp;
    int e=neigh[temp];
    while(e!=-1){
      --indge[edge[e].pos];
      if(indge[edge[e].pos]==0)queue[rear++]=edge[e].pos;
      e=edge[e].next;
    }
    
    }
    if(k<n)return -1;//huan
    if(ok)return 0;//chongfu
    return 1;//chenggong
    }
    int main(){
        char s[50];
        while(cin>>n>>m&&n){
            for(int i=0;i<n;i++){
               indegree[i]=0;
              neigh[i]=-1;
            }
            cur=0;
            err=ans=-1;
            for(int i=0;i<m;i++){
            cin>>s;
            if(err!=-1||ans!=-1)continue;//已经有结果了直接把后面的直接读掉就行
            int temp1=s[0]-'A',temp2=s[2]-'A';
            edge[cur].pos=temp2;
            edge[cur].next=neigh[temp1];//链表记录表相邻
            neigh[temp1]=cur;
            cur++;
            indegree[temp2]++;
            int res=toposort();
            if(res==1)ans=i+1;
            else if(res==-1)err=i+1;
            }
            if(ans!=-1){
                        printf("Sorted sequence determined after %d relations: ", ans);
                for (int i = 0; i < n; ++i) putchar('A' + seq[i]);
                printf(".
    ");
            
            }
            else if(err!=-1){
                           printf("Inconsistency found after %d relations.
    ", err);
            }
            else {
                            printf("Sorted sequence cannot be determined.
    ");
            
            }
            
        
        }
    return 0;
    }
  • 相关阅读:
    FFOM_秒交易行
    FFOM_脚本源代码
    农药_挂周金币
    保存数据,父页面列表数据更新
    点击按钮不弹出新窗口
    GridView1_RowDeleting 弹出确认对话框
    判断复选框
    获取Guid
    2019 gplt团体程序设计天梯赛总结
    Codeforces Round #550 (Div. 3)E. Median String
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/9995096.html
Copyright © 2011-2022 走看看