1 条题解

  • 0
    @ 2026-6-16 23:33:58

    // 传递闭包 Floyd 算法 O(m*n^3)
    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=30;
    int n,m;
    int d[N][N],vis[N];
    
    void floyd(){
      for(int k=0; k<n; k++)
      for(int i=0; i<n; i++)
      for(int j=0; j<n; j++)
        d[i][j]|=d[i][k]&d[k][j]; //d[i,j]=1 表示 i<j
    }
    int check(){
      for(int i=0; i<n; i++)if(d[i][i]) return 1; //发现矛盾
      for(int i=0; i<n; i++)
      for(int j=0; j<i; j++)
        if(!d[i][j] && !d[j][i]) return 0; //关系不确定
      return 2; //关系确定
    }
    char get(){
      for(int i=0; i<n; i++)if(!vis[i]){ //若i未输出
        bool flag=true;
        for(int j=0; j<n; j++)if(!vis[j] && d[j][i]){ //j未输出且j<i,则不合法
          flag=false; break;
        }
        if(flag){vis[i]=true; return 'A'+i;}
      }
    }
    int main(){
      cin>>n>>m;
      int opt=0,pos;
      for(int i=1; i<=m; i++){
        char a,b,c; cin>>a>>b>>c;
        if(opt==0){ //若关系不确定
          d[a-'A'][c-'A']=1;
          floyd();  //Floyd求传递关系
          opt=check();
          pos=i;    //记录当前关系位次
        }
      }
      if(opt==0)puts("Sorted sequence cannot be determined.");
      if(opt==1)printf("Inconsistency found after %d relations.\n",pos);
      if(opt==2){
        printf("Sorted sequence determined after %d relations: ",pos);
        for(int i=0; i<n; i++) printf("%c",get());
        printf(".\n");
      }
    }
    
    • 1

    D112 最短路→传递闭包 Floyd 算法 P1347 排序

    信息

    ID
    12495
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者