poj 1192 最优连通子集

来源:互联网 发布:淘宝登录界面无法打开 编辑:程序博客网 时间:2024/06/05 06:48

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


题意:求一个无向图的所有子树的权值和的最大值。

先把树建立起来,然后在树上进行一遍dfs就行了。


代码:

#include<cstdio>#include<cstring>#include<vector>#include<map>using namespace std;const int inf=-999999999;typedef pair<int,int> pa;map<pa,int> hash;vector<int> p[1005];int val[1005],vis[1005],s[1005];int n,Max;int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};void dfs(int u){    int i,v;    vis[u]=1;    s[u]=val[u];    for(i=0;i<p[u].size();i++)    {        v=p[u][i];        if(vis[v]) continue;        dfs(v);        if(s[v]>0)          s[u]+=s[v];    }    if(s[u]>Max)      Max=s[u];}int main(){    int i,j,x,y,c;    scanf("%d",&n);    hash.clear();    for(i=0;i<=n;i++)      p[i].clear();    memset(vis,0,sizeof(vis));    memset(s,0,sizeof(s));    for(i=1;i<=n;i++)    {        scanf("%d%d%d",&x,&y,&c);        hash[pa(x,y)]=i;        val[i]=c;        for(j=0;j<4;j++)        {            int xx=x+d[j][0],yy=y+d[j][1];            if(hash.count(pa(xx,yy)))            {                int tp=hash[pa(xx,yy)];                p[tp].push_back(i);                p[i].push_back(tp);            }        }    }    Max=inf;    dfs(1);    printf("%d\n",Max);    return 0;}