1 条题解
-
0

// 传递闭包 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
信息
- ID
- 12495
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者