HDU 2647 Reward(拓扑排序)
2016-11-15 13:32
363 查看
#include<bits/stdc++.h> using namespace std; int n,m,visit[10005],num[10005],topo[10005]; vector<int>map1[10005]; int dfs(int u) { visit[u]=-1; int max1=0; for(int i=0;i<map1[u].size();i++) { int v=map1[u][i]; if(visit[v]==-1) return -1; else if(!visit[v]) { int x=dfs(v); if(x==-1) return -1; else { max1=max(max1,x+1); } } } visit[u]=0; if(topo[u]==0) { num[u]=888; return 888; } else { num[u]=max1; return max1; } } bool toposort() { for(int i=1;i<=n;i++) { if(!visit[i]) { if(dfs(i)==-1) return false; } } return true; } int main() { int x,y; while(cin>>n>>m) { memset(visit,0,sizeof(visit)); memset(num,0,sizeof(num)); memset(topo,0,sizeof(topo)); for(int i=1;i<=m;i++) { cin>>x>>y; map1[x].push_back(y); topo[x]++; } if(toposort()) { int sum=0; for(int i=1;i<=n;i++) sum+=num[i]; cout<<sum<<endl; } else { cout<<-1<<endl; } for(int i=1;i<=n;i++) map1[i].clear(); } return 0; }
相关文章推荐
- HDU 2647 Reward(拓扑排序)
- hdu 2647 Reward - 拓扑排序
- HDU 2647 Reward(拓扑排序)
- hdu 2647 Reward(拓扑排序)
- HDU 2647 Reward(图论-拓扑排序)
- HDU 2647 Reward【拓扑排序】
- HDU - 2647 Reward 拓扑排序
- hdu 2647 Reward(拓扑排序)
- HDU 2647 Reward(拓扑排序)
- hdu 2647 Reward 拓扑排序(逆序)
- hdu 2647 Reward(拓扑排序)
- hdu 2647 Reward(拓扑排序)
- HDU 2647 Reward【拓扑排序】
- HDU 2647 Reward (拓扑排序 + 链式前向星 )
- hdu 2647 Reward(拓扑排序)
- HDU-2647 Reward ---拓扑排序
- hdu 2647 Reward(拓扑排序)
- hdu 2647 Reward 拓扑排序入门
- 【HDU 2647】Reward (邻接表实现拓扑排序,反向排序)
- HDU 2647--Reward【拓扑排序】