POJ 3249 Test for Job(拓扑排序)
2012-08-20 15:11
281 查看
题意:求从入度为0的点到出度为0的点的路上的权值最大之和。
思路:拓扑排序,注意,孤立点。
思路:拓扑排序,注意,孤立点。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; const int N = 100009; const int M = 1000009; const int INF = 0x3f3f3f3f; int n,m; struct LT{ int nex,to; } L[M]; int F ,cnt; void add(int f,int t) { L[cnt].nex = F[f]; L[cnt].to = t; F[f] =cnt++; } int val ; int in ; int sum ; queue<int> que; void init() { for(int i=1;i<=n;i++) scanf("%d",&val[i]),sum[i]=-INF; int f,t; memset(F,0,sizeof(F)),cnt=1; memset(in,0,sizeof(in)); for(int i=0;i<m;i++) scanf("%d%d",&f,&t),add(f,t),in[t]++; } void solve() { int ans = -INF; while(!que.empty()) que.pop(); for(int i=1;i<=n;i++) if(in[i]==0){ que.push(i),sum[i]=val[i]; if(F[i]==0) ans=max(ans,sum[i]);///孤立点 } while(!que.empty()) { int e = que.front();que.pop(); for(int i=F[e];i;i=L[i].nex) { int to = L[i].to; sum[to]=max(sum[to],sum[e]+val[to]); in[to]--; if(!in[to]) que.push(to); if(F[to]==0) ans = max(ans,sum[to]); } } printf("%d\n",ans); } int main() { freopen("in.txt","r",stdin); while(~scanf("%d%d",&n,&m)) { init(); solve(); } return 0; }
相关文章推荐
- poj 3249 Test for Job (拓扑排序)
- poj3249 Test for Job --- 拓扑排序
- POJ - 3249 Test for Job (DAG+topsort)
- POJ 3249 Test for Job 拓扑排序+DP
- POJ 3249 Test for Job
- POJ-3249 Test for Job DAG最短路
- POJ_3249 Test for Job(拓扑)
- POJ3249 Test for Job(记忆化搜索)
- POJ - 3249 Test for Job (DAG+topsort)
- POJ 3249 Test for Job(DAG上的dp + 记忆化搜索)
- POJ 3249 Test for Job 解题报告 DP
- Test for Job (poj 3249 记忆化搜索)
- poj 3249 Test for Job 最长路
- POJ 3249 Test for Job (DAG图上的单源最短路径) 最详细的图解
- POJ 3249 Test for Job (dfs + dp)
- poj 3249 Test for Job 图上dp(记忆化搜索)
- poj 3249 Test for Job (记忆化深搜)
- POJ 3249 Test for Job(记忆化搜索)
- poj--3249 Test for Job(topsort + dp)
- POJ 3249 Test for Job (记忆化搜索 好题)