紫书章六例题15 给任务排序 UVA 10305(拓扑排序)

来源:互联网 发布:软件层次结构图 编辑:程序博客网 时间:2024/05/29 19:48

题意:给你n个任务,但是这n个任务并不是独立的,意思就是有些任务必须在其他任务完成后才能开始做。法1:将之看为一个有向图,入度为0的入队,出队后,将以出队的这点为起点的边入度减一,然后再将没入队过的且入度为0的点入队。这个方法还可以看有没有有向环,即最后所有点没有全部被遍历到。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <sstream>#include <cmath>#include <queue>#include <vector>#include <queue>using namespace std;int n,m;struct node{    int to,pre;};int head[105];int rd[105];int vis[105];node e[10000];void add(int i,int from,int to){    e[i].to=to;e[i].pre=head[from];head[from]=i;}int main(){    while(scanf("%d %d",&n,&m)!=EOF&&m+n)    {        memset(head,-1,sizeof(head));        memset(rd,0,sizeof(rd));        memset(vis,0,sizeof(vis));        memset(e,0,sizeof(e));        int h=0;        for(int i=0;i<m;i++)        {            int a,b;            scanf("%d %d",&a,&b);            add(h,a,b);h++;            rd[b]++;        }        queue<int> q;        for(int i=1;i<=n;i++)        {            if(rd[i]==0) {q.push(i);vis[i]=1;}        }        int flag=0;        while(!q.empty())        {            int t=q.front();            q.pop();            if(flag) printf(" ");            printf("%d",t);            flag=1;            for(int i=head[t];i>-1;i=e[i].pre)            {                node temp=e[i];                if(!vis[temp.to])                  rd[temp.to]--;            }            for(int i=1;i<=n;i++)            {                if(!vis[i]&&rd[i]==0) {vis[i]=1;q.push(i);}            }        }        printf("\n");    }    return 0;}
0 0