uva 10305 ordering tasks题解

来源:互联网 发布:linux安装eclipse jdk 编辑:程序博客网 时间:2024/06/06 03:03

经典拓扑排序入门题
先让入度0的顶点输出,然后将这些顶点所在的边剪掉,然后再让入度为0的顶点输出……直至所有顶点输出。此题注意有一个陷阱,m=0是可以的,就相当于任何一个都可以直接输出。
此题还有一点就是它的输出顺序,先把所有入度为0 的顶点按序号从小到大输出,然后再去剪掉边,所以就加了flag0数组来存放这些顶点

#include <stdio.h>#include <string.h>struct _tag{    int intil,last;}v[10000];int flag[101],flag0[101];int main(int argc, char const *argv[]){    int n,m,i,k,j,fl0;    while(scanf("%d %d",&n,&m)==2&&(n||m))//m=0是可以的    {        k=0;        memset(flag,0,101*sizeof(int));        for(i=1;i<=m;i++)            {scanf("%d %d",&v[i].intil,&v[i].last);                flag[v[i].last]++;        }        while(k<n)        {            fl0=0;            for(i=1;i<=n;i++)                if(!flag[i]) flag0[fl0++]=i;            for(i=0;i<fl0;i++)                {printf("%d%c",flag0[i],k==n-1?'\n':' ' );            for(j=1;j<=m;j++)                if(v[j].intil==flag0[i]) flag[v[j].last]--;            flag[flag0[i]]--;            k++;}        }    }    return 0;}
0 0