Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 2140 | Accepted: 1139 |
Description
Input
Output
Sample Input
50 0 -20 1 11 0 10 -1 1-1 0 1Sample Output
2
分析: 这题的意思是求一个连通图,并要求这个图的拥有最大权。 用的是树状DP,用DFS深搜,DP[u][0]表示以u为根且不含u的最大值,Dp[u][1]表示以u为根且含有u的最大值; 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int MAXN = 1010; int ABS(int x) { return x > 0 ? x : -x; } struct Node { int to,next; }; Node n[MAXN<<1]; int index = 0; int head[MAXN]; void make_map(int from,int to) { n[index].to = to; n[index].next = head[from]; head[from] = index++; } void makemap(int from,int to) { make_map(from,to); make_map(to,from); } int X[MAXN],Y[MAXN],C[MAXN]; int N; int vis[MAXN],dp[MAXN][2]; void DFS(int u) { vis[u] = 1; dp[u][0] = 0;dp[u][1] = C[u]; for(int i = head[u];~i;i=n[i].next) { int v = n[i].to; if(!vis[v]) { DFS(v); dp[u][0] = max(dp[u][0],max(dp[v][0],dp[v][1])); //将无根与其子孙比较。 if(dp[v][1]>0) dp[u][1] += dp[v][1]; } } } int main() { while(scanf("%d",&N)!=EOF) { for(int i = 1;i <= N;i++) { scanf("%d%d%d",&X[i],&Y[i],&C[i]); } index=0; memset(head,-1,sizeof(head)); memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); for(int i = 1;i <= N;i++) { for(int j = i+1;j <= N;j++) { if(1 == ABS(X[i]-X[j]) + ABS(Y[i]-Y[j])) { makemap(i,j); } } } DFS(1); printf("%d\n",max(dp[1][0],dp[1][1])); } return 0; }