POJ 3249

http://poj.org/problem?id=3249

/* 题意就是:给你一个有向图,每一个节点有一个权值,现在要你从一个入度为0 到一个出度为0的路径,使得权值 最大 */ //拓扑排序dp[j]=max(dp[j],dp[i]+b[j]),dp[i]表示从起点到i的最大权值 //最后找出出度为0点中状态最优的点即可 #include<iostream> #include<vector> using namespace std; #define inf 99999999 #define MAXN 100001 int n, m; vector<int> graph[MAXN];//存放图 int in[MAXN];//节点的入度 int out[MAXN];//节点的出度 bool visit[MAXN]; int dp[MAXN]; int b[MAXN]; /*struct node { vector<int> v; }graph[MAXN];*/ inline int max(int x, int y) { return x > y ? x : y; } int main() { // freopen("in.txt", "r", stdin); int i, j, c; while(scanf("%d %d", &n, &m) != EOF) { for(i=0; i<=n; i++) { visit[i] = false; in[i] = 0; out[i] = 0; b[i] = 0; graph[i].clear(); // (graph[i].v).clear(); } for(i=1; i<=n; i++) { scanf("%d", &b[i]); } int u, v; for(i=1; i<=m; i++) { scanf("%d %d", &u, &v); out[u]++; in[v]++; // (graph[u].v).push_back(v); graph[u].push_back(v); } for(i=1; i<=n; i++) { if(in[i] == 0) dp[i] = b[i]; else dp[i] = -inf; } c = 1; while(c < n) { for(i=1; i<=n; i++) { if(in[i] == 0 && !visit[i])//找到入度为0的起点 { visit[i] = true; c++; for(j=0; j<graph[i].size(); j++) { int t = graph[i][j]; // int t = (graph[i].v)[j]; in[t]--; dp[t] = max(dp[t], dp[i] + b[t]); } } } } int num = -inf; for(i=1; i<=n; i++) { if(out[i] == 0 && dp[i] > num) num = dp[i]; } printf("%d/n", num); } return 0; }

你可能感兴趣的:(c,struct,Graph)