poj 4313 Matrix

http://acm.hdu.edu.cn/showproblem.php?pid=4313

一遍dfs   注意值的传递就可以了

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cstring>

#include<cmath>

#include<map>

#include<cmath>

#define LL long long



using namespace std;



const int N=100010;

const int M=1000000000;

struct node

{

    LL sum;

    struct tt *next;

}mem[N];

bool machine[N];

struct tt

{

    int j;

    int k;

    struct tt *next;

};

LL Mmax(LL a,LL b)

{

    if(a>b)

    return a;

    return b;

}

LL Mmin(LL a,LL b)

{

    if(a<b)

    return a;

    return b;

}

void build(int i,int j,int k)

{

    struct tt *t=new tt;

    t->j=j;

    t->k=k;

    t->next=mem[i].next;

    mem[i].next=t;

}

void Dele(int n)

{

    for(int i=0;i<n;++i)

    mem[i].next=NULL;

}

LL dfs(int pre,int x)

{

    //cout<<x<<endl;

    struct tt *t=mem[x].next;

    bool flag=false;

    mem[x].sum=0;

    LL sumtemp=0;

    LL Msum=0;

    while(t!=NULL)

    {

        if(t->j==pre)

        {t=t->next;continue;}

        flag=true;

        LL a;

        a=dfs(x,t->j);

        a=Mmin(a,(LL)(t->k));

        sumtemp+=a;

        Msum=Mmax(Msum,a);

        mem[x].sum+=mem[t->j].sum;

        t=t->next;

    }

    if(flag==false)

    {//cout<<x<<" "<<mem[x].sum<<endl;

        if(machine[x]==true)

        return M;

        return 0;

    }

    mem[x].sum+=sumtemp;

    if(machine[x]==true)

    {//cout<<x<<" "<<mem[x].sum<<endl;

        return M;

    }else

    {

        mem[x].sum-=Msum;

        return Msum;

    }

}

int main()

{

    //freopen("data.txt","r",stdin);

    int T;

    scanf("%d",&T);

    int n,m;

    while(T--)

    {

        scanf("%d %d",&n,&m);

        for(int i=1;i<n;++i)

        {

            int x,y,k;

            scanf("%d %d %d",&x,&y,&k);

            build(x,y,k);

            build(y,x,k);

        }

        memset(machine,false,sizeof(machine));

        while(m--)

        {

            int x;

            scanf("%d",&x);

            machine[x]=true;

        }

        dfs(-1,0);

        cout<<mem[0].sum<<endl;

        Dele(n);

    }

    return 0;

}

  

你可能感兴趣的:(Matrix)