标签:des style http java color strong
这个题目是拓扑排序,因为边的数目非常大,所以普通的建图会爆内存,所以这里采用vector容器。
1:建完图后对入度为0的点加入队列,然后对整幅图进行扫描,得到每个点的位置。
2:要用一个数组存相对位置,所以不能只用一个变量存储,因为每次出队列只能有一个元素。。
2:用数组模拟果然比stl快一些。。。
题目链接:
题面:
2 1 1 2 2 2 1 2 2 1
1777 -1
代码如下:
#include<cstdio> #include<iostream> #include<vector> #include<cstring> using namespace std; const int maxn=10000+1; int in[maxn],order[maxn],Gery[maxn]; int n,m,sum; vector<int>vec[maxn]; void read_graph() { int u,v; for(int i=0;i<=n;i++)//这个地方有改动 { in[i]=0; order[i]=0; vec[i].clear(); } for(int i=1;i<=m;i++) { scanf("%d%d",&u,&v); in[u]++; vec[v].push_back(u); } } int topo() { int head=0,tail=0,ans; sum=n; for(int i=1;i<=n;i++) { if(in[i]==0) Gery[tail++]=i; } while(head<tail) { sum--; int top=Gery[head]; int temp=order[top]; head++; for(int i=0;i<vec[top].size();i++) { if(--in[vec[top][i]]==0) { order[vec[top][i]]=temp+1; Gery[tail++]=vec[top][i]; } } } if(sum>0) return -1; else { ans=888*n; for(int i=1;i<=n;i++) ans=ans+order[i]; } return ans; } int main() { while(~scanf("%d%d",&n,&m)) { read_graph(); int ans=topo(); if(ans!=-1) printf("%d\n",ans); else printf("-1\n"); } return 0; } /* 5 4 2 1 4 2 3 1 5 3 */
标签:des style http java color strong
原文地址:http://blog.csdn.net/u014303647/article/details/37692533