首页 > 代码库 > UESTC 916 方老师的分身III --拓扑排序
UESTC 916 方老师的分身III --拓扑排序
做法:
如果有a<b的关系,则连一条a->b的有向边,连好所有边后,找入度为0的点作为起点,将其赋为最小的价值888,然后其所有能到的端点,价值加1,加入队列,删去上一个点,然后循环往复,直到队列为空,即每个点都赋予了一个权值为止。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <queue>using namespace std;#define N 10007int first[N],in[N],candy[N];int tot;struct node{ int u,v,next,w;}G[20006];void addedge(int u,int v){ G[tot].u = u; G[tot].v = v; G[tot].w = 1; G[tot].next = first[u]; first[u] = tot++;}int main(){ int n,m,cnt,i,j,x; int a,b; queue<int> que; while(scanf("%d%d",&n,&m)!=EOF) { memset(in,0,sizeof(in)); while(!que.empty()) que.pop(); memset(first,-1,sizeof(first)); tot = 0; for(i=0;i<m;i++) { scanf("%d%d",&a,&b); addedge(b,a); in[a]++; } for(i=1;i<=n;i++) { if(in[i] == 0) { que.push(i); candy[i] = 888; } } cnt = 0; while(!que.empty()) { x = que.front(); que.pop(); cnt++; for(int e=first[x];e!=-1;e=G[e].next) { in[G[e].v]--; if(in[G[e].v] == 0) { que.push(G[e].v); candy[G[e].v] = candy[x]+1; } } } if(cnt < n) puts("-1"); else { int sum = 0; for(i=1;i<=n;i++) sum += candy[i]; printf("%d\n",sum); } } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。