hdu 2647 拓扑排序

来源:互联网 发布:10.11.4制作mac安装u盘 编辑:程序博客网 时间:2024/06/11 19:40

题意:有n个人m种关系 每种关系是x>y

然后判断有无解 最小解是多少。


最简单的拓扑排序了 

建图然后跑完拓扑  最后判断是否是DAG就可以

#include<iostream>#include<cstdio>#include<queue>using namespace std;#define maxn 11111int in[maxn];struct edge{    int u,v,next;}e[maxn*10];int head[maxn],cnt,ans[maxn];void init(){    memset(in,0,sizeof in);    memset(head,-1,sizeof head);    memset(ans,0,sizeof ans);    cnt=0;}void add(int u,int v){    e[cnt].u=u;e[cnt].v=v;    e[cnt].next=head[u];    head[u]=cnt;cnt++;}int main(){    int n,m,x,y;    while(~scanf("%d%d",&n,&m)){        init();                for(int i=0;i<m;++i){            scanf("%d%d",&x,&y);            add(y,x);            in[x]++;        }        int all=0;        priority_queue<int>q;        for(int i=1;i<=n;++i){            if(in[i]==0){q.push(i);all++;}        }        while(!q.empty()){            int cur=q.top();q.pop();            for(int i=head[cur];i!=-1;i=e[i].next){                int v=e[i].v;                in[v]--;ans[v]=max(ans[cur]+1,ans[v]);                if(in[v]==0){q.push(v);all++;}            }        }        if(all<n){            printf("-1\n");        }        else{            int x=0;            for(int i=1;i<=n;++i){                x+=ans[i];            }            printf("%d\n",x+n*888);        }    }    return 0;}


0 0
原创粉丝点击