标签:style blog color os io for 问题 代码
2647题是对工人排序问题,不是从头到尾排序,而是从尾到头排序;
代码中用到vector和queue容器,权当练习。
用广搜进行拓扑排序的逆运算。
1 #include<iostream> 2 #include<vector> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 const int maxn=10010; 7 int main() 8 { 9 int n,m; 10 int sum[maxn]; 11 int out[maxn]; 12 while(cin>>n>>m) 13 { 14 int a,b; 15 vector<int>next[maxn]; 16 queue<int>q; 17 memset(sum,0,sizeof(sum)); 18 memset(out,0,sizeof(out)); 19 for(int i=0;i<m;i++) 20 { 21 cin>>a>>b; 22 next[b].push_back(a); 23 out[a]++; 24 } 25 for(int i=1;i<=n;i++) 26 { 27 if(out[i]==0) 28 { 29 q.push(i); 30 sum[i]=888; 31 } 32 } 33 if(q.empty()) 34 { 35 cout<<-1<<endl; 36 continue; 37 } 38 int cnt=n; 39 while(!q.empty()) 40 { 41 int v=q.front(); 42 q.pop(); 43 cnt--; 44 for(int i=0;i<next[v].size();i++) 45 { 46 out[next[v][i]]--; 47 if(out[next[v][i]]==0) 48 { 49 q.push(next[v][i]); 50 sum[next[v][i]]=sum[v]+1; 51 } 52 } 53 } 54 if(cnt>0) 55 { 56 cout<<-1<<endl; 57 continue; 58 } 59 int ans=0; 60 for(int i=1;i<=n;i++) 61 { 62 ans+=sum[i]; 63 } 64 cout<<ans<<endl; 65 } 66 return 0; 67 }
标签:style blog color os io for 问题 代码
原文地址:http://www.cnblogs.com/sytu/p/3877252.html