【基础拓扑排序】poj 2376/ural 1022

来源:互联网 发布:dag 软件 编辑:程序博客网 时间:2024/04/28 00:18

简单的topsort,不解释!

可用队列做,也可用for遍历!

#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>using namespace std;int lowbit(int t){return t&(-t);}int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}#define LL long long#define PI acos(-1.0)#define N  1000010#define MAX INT_MAX#define MIN INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)int g[110][110];int in[110];int n,cnt;int ans[110];void topsort(){    int i,j,k;    cnt=0;    /*    for(i=1;i<=n;i++){//遍历n次        for(j=1;j<=n;j++)        if(in[j]==0)        {ans[cnt++]=j;in[j]=-1;break;}        for(k=1;k<=n;k++)        if(g[j][k])        in[k]--;    }*/    queue<int> q;    for(i=1;i<=n;i++)    if(in[i]==0){        q.push(i);        in[i]=-1;        break;    }    while(!q.empty()){        int x=q.front();        q.pop();        ans[cnt++]=x;        for(i=1;i<=n;i++){            if(g[x][i])            in[i]--;            if(in[i]==0)            {                in[i]=-1;                q.push(i);            }        }    }}int main(){    int i,j,k;    while(scanf("%d",&n)!=EOF){        memset(in,0,sizeof(in));        memset(g,0,sizeof(g));        for(i=1; i<=n; i++){            int a;            while(scanf("%d",&a)&&a){                g[i][a]=1;                in[a]++;            }        }        topsort();        printf("%d",ans[0]);        for(i=1;i<cnt;i++)        printf(" %d",ans[i]);        puts("");    }    return 0;}


原创粉丝点击