ACM PKU 1192 最优连通子集

 题目描述:http://poj.org/problem?id=1192

说实话,这道题我看了半天恁是没有看懂什么意思,最后看人家代码写了一个深搜,还是看代码容易理解一点,也不知道是中文的说明有问题还是我的理解能力有问题,呵呵

不管了,看代码吧!

 1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #include <algorithm>
5 #include <cmath>
6 #include <vector>
7 using namespace std;
8 const int Maxn=1010;
9
10 struct node
11 {
12 int x,y,w;
13 } point[Maxn];
14
15 vector<int>ver[Maxn];
16
17 int N,res;
18 bool flag[Maxn];
19
20 int dfs(int x)
21 {
22 int ans=0;
23 flag[x]=1;
24 for(int i=0; i<(int)(ver[x].size()); i++)
25 {
26 int v = ver[x][i];
27 if(!flag[v])
28 {
29 int temp=dfs(v);
30 if(temp>0) ans+=temp;
31 }
32 }
33 if(ans+point[x].w>res) res=ans+point[x].w;
34 return ans+point[x].w;
35 }
36
37 void init()
38 {
39 res=0;
40 for(int i=0; i<N; i++) ver[i].clear();
41 memset(flag,0,sizeof(flag));
42 for(int i=0; i<N; i++)
43 {
44 scanf("%d%d%d",&point[i].x,&point[i].y,&point[i].w);
45 }
46 for(int i=0; i<N; i++)
47 for(int j=i+1; j<N; j++)
48 {
49 if(abs(point[i].x-point[j].x)+abs(point[i].y-point[j].y)==1)
50 {
51 ver[i].push_back(j);
52 ver[j].push_back(i);
53 }
54 }
55 }
56
57 int main()
58 {
59 freopen("in.txt","r",stdin);
60 while(scanf("%d",&N)!=EOF)
61 {
62 init();
63 printf("%d",dfs(0));
64 }
65 return 0;
66 }

  

posted on 2011-08-13 20:58  _Clarence  阅读(118)  评论(0编辑  收藏  举报

导航