POJ 1094 Sorting It All Out 拓扑排序(比较好的模板)

来源:互联网 发布:网络写手赚钱吗 编辑:程序博客网 时间:2024/06/09 14:44

看好题目要求,输入一句立即判断,其余没有什么特殊要求

#include<stdio.h>#include<string.h>#include<stdlib.h>int map[110][110];int du[110];int du2[110];char a[1110];int flag;//0表示排好,1表示无序,2成环int n, m;void topsort(){    int i, j;    int cnt = 0;    for(i = 1;i <=n;i++){        du2[i] = du[i];    }    int pos;    int e;    for(i = 1;i <= n;i++){        e = 0;        for(j = 1;j <= n;j++){            if(du2[j] == 0){                pos = j;                e++;            }        }        if(e== 0)   {            flag = 2;//成环            return;        }        if(e > 1){            flag = 1;//至少又一个点无法确定排序        }        du2[pos] = -1;//把此点删除掉        a[cnt++] = 'A'+pos-1;//A是1开始存的,所以要减1        a[cnt] = '\0';        for(j = 1;j <= n;j++){            if(map[pos][j]){                du2[j]--;            }        }    }}int main(){    char str[5];    int sign;//标记是否还继续判断,如果输出,就不用继续判断输入的条件    int i;    while(~scanf("%d %d", &n, &m)){        if(n==0&&m==0)  break;        sign = 0;        memset(du,0,sizeof(du));        memset(map,0,sizeof(map));                for(i = 1;i <= m;i++){            scanf("%s", str);            if(sign == 1) continue;                        flag = 0;            map[str[0]-'A'+1][str[2]-'A'+1] = 1;            du[str[2]-'A'+1]++;            topsort();                        if(flag==2){                printf("Inconsistency found after %d relations.\n", i);                sign = 1;            }            if(flag == 0){                printf("Sorted sequence determined after %d relations: %s.\n", i, a);                sign = 1;            }        }        if(flag == 1){            printf("Sorted sequence cannot be determined.\n");        }    }    return 0;}

0 0