17ACM Asia Shenyang 1008 transaction

来源:互联网 发布:mac 删除文件 命令 编辑:程序博客网 时间:2024/05/29 18:42

题目:HDU 6201
分析
法一:树形DP,递归形式DP比较好写,不过我RE了= -
☆法二:建一个虚拟节点,与每一个点连接,边权值为每一个点的价格;
用spfa求从虚拟节点到每一个节点的最短路f[i];
则答案为max{price[i]-f[i]};
复杂度为O(m+n);
这里写图片描述
代码

#include <cstdio>#include <algorithm>#include <cstring>#include <vector>#include <queue>using namespace std;const int Tmax=100005;struct edge{    int a,b,c;};edge E[Tmax];int n,f[Tmax],price[Tmax];vector <int> G[Tmax];queue <int> Q;bool in[Tmax];void spfa(){    int tmp,i,len;    while(!Q.empty()) Q.pop();    for(i=1;i<=n;i++)    {        Q.push(i);        in[i]=true;    }    while(!Q.empty())    {        tmp=Q.front();        in[tmp]=false;        Q.pop();        len=G[tmp].size();        for(i=0;i<len;i++)        {            if(E[G[tmp][i]].b==tmp) swap(E[G[tmp][i]].a,E[G[tmp][i]].b);            if(f[E[G[tmp][i]].b]>f[tmp]+E[G[tmp][i]].c)            {                f[E[G[tmp][i]].b]=f[tmp]+E[G[tmp][i]].c;                if(in[E[G[tmp][i]].b]==false) {                    in[E[G[tmp][i]].b]=true;                    Q.push(E[G[tmp][i]].b);                }            }        }    }    return;}int main(){    int T,i,ans;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(i=0;i<=n+1;i++)          G[i].clear();        memset(f,0,sizeof(f));        for(i=1;i<=n;i++)        {            scanf("%d",&price[i]);            f[i]=price[i];            /*            E[n+i].a=0;            E[n+i].b=i;            G[0].push_back(n+i);*/        }        for(i=1;i<n;i++)        {            scanf("%d%d%d",&E[i].a,&E[i].b,&E[i].c);            G[E[i].a].push_back(i);            G[E[i].b].push_back(i);        }        //memset(in,0,sizeof(in));        spfa();        ans=0;        for(i=1;i<=n;i++)          ans=max(ans,price[i]-f[i]);        printf("%d\n",ans);    }    return 0;}
阅读全文
0 0
原创粉丝点击