SGU 230 拓扑排序

来源:互联网 发布:ubuntu chromium 编辑:程序博客网 时间:2024/05/01 08:11

利用拓扑排序,判断环即可。

#include <stdio.h>#include <iostream>#include <queue>#include <algorithm>#include <map>#include <vector>#include <cmath>#include <string.h>#include <stdlib.h>#include <time.h>#include <fstream>#include <set>#include <stack>#include <list>using namespace std;#define READ freopen("acm.in","r",stdin)#define WRITE freopen("acm.out","w",stdout)#define ll long long#define ull unsigned long long #define uint unsigned int#define PII pair<int,int>#define PDD pair<double,double>#define fst first#define sec second#define MS(x,d) memset(x,d,sizeof(x))#define INF 0x3f3f3f3f#define ALL(x) x.begin(),x.end()#define PB push_back#define MOD 99991#define MAX 1000000int n,m;vector<int> G[20000];vector<int> topo;bool judge(){    int du[20000];    int cnt=0;    queue<int> q;    MS(du,0);    for(int i=1;i<=n;i++)        for(int j=0;j<G[i].size();j++)            du[G[i][j]]++;    for(int i=1;i<=n;i++)        if(!du[i])            q.push(i),topo.push_back(i);    cnt+=q.size();    while(!q.empty())    {        int u=q.front();        q.pop();        for(int i=0;i<G[u].size();i++)        {            int v=G[u][i];            du[v]--;            if(!du[v])                q.push(v),cnt++,topo.push_back(v);        }    }    return cnt==n;}int main(){    READ;    scanf("%d%d",&n,&m);    for(int i=0;i<m;i++)    {        int f,t;        scanf("%d%d",&f,&t);        G[f].push_back(t);    }    int ans[20000];    if(judge())    {        for(int i=1;i<=n;i++)            ans[topo[i-1]]=i;        for(int i=1;i<=n;i++)        {            cout<<ans[i];//<<" ";            if(i!=n)                cout<<" ";        }        cout<<endl;    }    else        puts("No solution");    return 0;}


0 0
原创粉丝点击