hdu 2647 Reward 拓扑排序入门
2014-11-11 22:25
393 查看
需建反向边,且取dep的时候应去较大值
#include<stdio.h> #include<string.h> #include<algorithm> #include<vector> #include<queue> using namespace std; #define N 10005 vector<int> v ; int dep , vis , in ; queue<int> q; int n, m; bool ok; void init() { memset( dep, 0, sizeof(dep) ); memset( in, 0, sizeof(in) ); for( int i = 1; i <= n; i ++ ) { v[i].clear(); } ok = 0; } void bfs( int u ) { while(!q.empty()) q.pop(); memset(vis, 0, sizeof(vis)); q.push(u); vis[u] = 1; while( !q.empty() ) { int x = q.front(); q.pop(); for ( int i = 0; i < v[x].size(); i++ ) { int to = v[x][i]; if( vis[to] ) { ok = 1; return; } dep[to] = max(dep[x] + 1, dep[to]); q.push(to); } } } int main() { while( ~scanf("%d%d", &n, &m) ) { init(); int a, b; for ( int i = 1; i <= m; i++ ) { scanf("%d%d", &a, &b); in[a] = 1; v[b].push_back(a); } for ( int i = 1; i <= n; i ++ ) { if(ok) break; bfs(i); } if(ok) { printf("-1\n"); } else { int ans = 0; for ( int i = 1; i <= n; i++ ) { ans += 888 + dep[i]; } printf("%d\n", ans); } } return 0; } /* 4 4 1 2 1 3 1 4 2 4 4 4 1 2 1 3 1 4 2 3 output:3555 */
相关文章推荐
- 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(拓扑排序)