2 1 1 2 2 2 1 2 2 1
1777 -1#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> const int INF = 1e6; const int ma = 1010; #define MAX 0x3f3f3f3f using namespace std; struct node{ int u,v,next; }g[20100]; int head[20100],n,m,rudu[10100],t; int cost[10100]; //struct no{ // int x,ans; // friend bool operator < (const no &a,const no &b) // { // return a.ans>b.ans; // } //}; void add(int a,int b) { g[t].u = a; g[t].v = b; g[t].next = head[a]; head[a] = t++; } int l; bool vis[10010]; void TOP() { //priority_queue<no>q; l = 0; // no f,t; memset(vis,0,sizeof(vis)); for(int i = 1;i<=n;i++) cost[i] = 888; int sum = 0; int flag = 1; for(int i = 1;i<=n;i++) { for(int j = 1;j<=n;j++) { if(rudu[j]==0) { rudu[j]--; l++; sum+=cost[j]; for(int k = head[j];k!=0;k = g[k].next) { rudu[g[k].v]--; if(cost[g[k].v] < cost[j]+1) //这句不能少,要判断当前连接的点有没有被其他的点+1过,加过则不加 cost[g[k].v] = cost[j]+1; } } } } //printf("l = %d\n",l); if(l==n) printf("%d\n",sum); else puts("-1"); } int main() { int a,b; while(~scanf("%d%d",&n,&m)) { memset(rudu,0,sizeof(rudu)); memset(head,0,sizeof(head)); t = 1; for(int i = 0;i<m;i++) { scanf("%d%d",&a,&b); add(b,a); rudu[a]++; } TOP(); } return 0; }队列形式的拓扑排序#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> const int INF = 1e6; const int ma = 1010; #define MAX 0x3f3f3f3f using namespace std; struct node{ int u,v,next; }g[50000]; int head[50100],n,m,rudu[10100],t; struct no{ int x,ans; }; void add(int a,int b) { g[t].u = a; g[t].v = b; g[t].next = head[a]; head[a] = t++; } int aa[1100],l; void TOP() { queue<no>q; l = 0; no f,t; t.ans = 888; bool vis[10010]; memset(vis,0,sizeof(vis)); long long sum = 0; for(int j = 1;j<=n;j++) { if(rudu[j]==0 && !vis[j]) { rudu[j]--; vis[j] = 1; l++; t.x = j; q.push(t); } } while(!q.empty()) { f = q.front(); q.pop(); sum += f.ans; if(!head[f.x]) continue; for(int i = head[f.x];i!=0;i = g[i].next) { rudu[g[i].v]--; if(rudu[g[i].v]==0 && !vis[g[i].v]) { l++; if(t.ans<f.ans+1) t.ans = f.ans+1; t.x = g[i].v; q.push(t); vis[t.x] = 1; } } } //printf("l = %d\n",l); if(l==n) cout<<sum<<endl; else puts("-1"); } int main() { int a,b; while(~scanf("%d%d",&n,&m)) { memset(rudu,0,sizeof(rudu)); memset(head,0,sizeof(head)); t = 1; for(int i = 0;i<m;i++) { scanf("%d%d",&a,&b); add(b,a); rudu[a]++; } TOP(); } return 0; }
HDU 2467 Reward(逆拓扑排序),布布扣,bubuko.com
原文:http://blog.csdn.net/wjw0130/article/details/38338133