• POJ1094 Sorting It All Out


    有向图找环

     1 #include<cstdio>
     2 #include<cstring>
     3 int map[27][27],indegree[27],q[27];
     4 int TopoSort(int n){
     5     int t=0,temp[27],p,m,flag=1;  //flag=1:有序 flag=-1:不确定
     6     for(int i=1;i<=n;i++)temp[i]=indegree[i];
     7     for(int i=1;i<=n;i++){
     8         m=0;for(int j=1;j<=n;j++)if(temp[j]==0)m++,p=j;//查找入度为零的顶点个数
     9         if(m==0)return 0; //有环
    10         if(m>1) flag=-1;  //无序
    11         q[++t]=p,temp[p]=-1;//入度为零的点入队
    12         for(int j=1;j<=n;j++)if(map[p][j]==1)temp[j]--;
    13     }
    14     return flag;
    15 }
    16 int main(){
    17     int n,m,sign,x,y;
    18     for(char s[5];scanf("%d%d",&n,&m)!=EOF;){
    19         if(n==0&&m==0)break;
    20         memset(map,0,sizeof(map)),sign=0;
    21         memset(indegree,0,sizeof(indegree));
    22         for(int i=1;i<=m;i++){
    23             scanf("%s",s);
    24             if(sign)continue;
    25             x=s[0]-'A'+1,y=s[2]-'A'+1;
    26             map[x][y]=1,indegree[y]++;
    27             int f=TopoSort(n);
    28             if(f==0)sign=1,printf("Inconsistency found after %d relations.
    ",i);
    29             if(f==1){
    30                 sign=1,printf("Sorted sequence determined after %d relations: ",i);
    31                 for(int j=1;j<=n;j++)printf("%c",q[j]+'A'-1);
    32                 puts(".");
    33             }
    34         }
    35         if(!sign)puts("Sorted sequence cannot be determined.");
    36     }
    37     return 0;
    38 }
    topsort
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 const int N = 30;
     7 int n, m, d[N][N], e[N][N];
     8  
     9 int floyd() {
    10     memcpy(e, d, sizeof(e));
    11     for (int k = 0; k < n; k++)
    12         for (int i = 0; i < n; i++)
    13             for (int j = 0; j < n; j++) {
    14                 e[i][j] |= e[i][k] & e[k][j];
    15                 if (e[i][j] == e[j][i] && e[i][j] && i != j) return -1;
    16             }
    17     for (int i = 0; i < n; i++)
    18         for (int j = 0; j < n; j++)
    19             if (e[i][j] == e[j][i] && !e[i][j] && i != j) return 0;
    20     return 1;
    21 }
    22  
    23 void Sorting_It_All_Out() {
    24     memset(d, 0, sizeof(d));
    25     bool flag = 1;
    26     for (int i = 1; i <= m; i++) {
    27         char s[6];
    28         scanf("%s", s);
    29         d[s[0]-'A'][s[2]-'A'] = 1;
    30         if (flag) {
    31             int now = floyd();
    32             if (now == -1) {
    33                 printf("Inconsistency found after %d relations.
    ", i);
    34                 flag = 0;
    35             } else if (now == 1) {
    36                 printf("Sorted sequence determined after %d relations: ", i);
    37                 pair<int, char> ans[N];
    38                 for (int j = 0; j < n; j++) {
    39                     ans[j].first = 0;
    40                     ans[j].second = 'A' + j;
    41                 }
    42                 for (int j = 0; j < n; j++)
    43                     for (int k = 0; k < n; k++)
    44                         if (e[j][k]) ++ans[j].first;
    45                 sort(ans, ans + n);
    46                 for (int j = n - 1; j >= 0; j--) printf("%c", ans[j].second);
    47                 puts(".");
    48                 flag = 0;
    49             }
    50         }
    51     }
    52     if (flag) puts("Sorted sequence cannot be determined.");
    53 }
    54  
    55 int main() {
    56     while (cin >> n >> m && n) Sorting_It_All_Out();
    57     return 0;
    58 }
    floyd
    ~~Jason_liu O(∩_∩)O
  • 相关阅读:
    hibernate 联合主键
    hibernate主键生成策略
    SpringMVC 的RequestMapping
    RestController 和Controller的区别
    进程&线程&协程
    mac 上好用的软件
    这世界上最激动的事,就是自己把握自己的人生!
    GO 语言学习之结构体
    ubuntu 批量杀死包含指定名称的进程
    vim
  • 原文地址:https://www.cnblogs.com/JasonCow/p/14961232.html
Copyright © 2020-2023  润新知