首页 > 代码库 > 拓扑排序

拓扑排序

#include <stdio.h>#include <string.h>#include <queue>using namespace std;#define N 505int ma[N][N],ans[N],indegree[N];int main(){    int i,j,n,m;    while(~scanf("%d %d",&n,&m))    {        memset(ma,0,sizeof(ma));        memset(indegree,0,sizeof(indegree));        while(m--)        {            int x,y;            scanf("%d %d",&x,&y);            if(!ma[x][y]) indegree[y]++;            ma[x][y] = 1;        }        queue<int>q;        int k = 0;        for(i = 1; i <= n ; i++) if(indegree[i] == 0) {indegree[i]--;q.push(i);break;}        while(!q.empty())        {            int cur = q.front();            q.pop();            ans[k++] = cur;            for(i = 1 ; i <= n ; i++)            {                if(ma[cur][i])                {                    ma[cur][i] = 0;                    indegree[i]--;                }            }            for(j = 1 ; j <= n ; j++) if(indegree[j] == 0) {indegree[j]--;q.push(j);break;}        }        for(i = 0 ; i <k ; i++)            printf("%d%c",ans[i],i == k-1?\n: );    }}
#include <stdio.h>#include <string.h>#include <queue>#include <vector>using namespace std;#define N 505int ans[N],indegree[N];int main(){    int i,j,n,m;    vector<int>e[N];    while(~scanf("%d %d",&n,&m))    {        memset(e,0,sizeof(e));        memset(indegree,0,sizeof(indegree));        while(m--)        {            int x,y;            scanf("%d %d",&x,&y);            e[x].push_back(y);            indegree[y]++;        }        queue<int>q;        int k = 0;        for(i = 1; i <= n ; i++) if(indegree[i] == 0) {indegree[i]--;q.push(i);break;}        while(!q.empty())        {            int cur = q.front();            q.pop();            ans[k++] = cur;            for(i = 0 ; i < e[cur].size() ; i++)                    indegree[e[cur][i]]--;            for(j = 1 ; j <= n ; j++) if(indegree[j] == 0) {indegree[j]--;q.push(j);break;}        }        for(i = 0 ; i <k ; i++)            printf("%d%c",ans[i],i == k-1?\n: );    }}