hdu6201transaction transaction transaction(最长路spfa vector模板)

来源:互联网 发布:封面制作软件ios 编辑:程序博客网 时间:2024/06/08 12:51

思路:

把点权化成边权,跑最短路,这题卡常数了,必须用vector版的邻接表跑spfa才能过。

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxm = 1e5+7;const int maxn = 1e5+7;const ll inf = 0x3f3f3f3f3f3f3f3f;struct Edge{    int u, v;    ll val;    Edge(int u = 0,int v = 0,ll val = 0):u(u), v(v), val(val){}};vector<Edge>edges;vector<int>g[maxn];void add(int u,int v,ll val){    edges.push_back(Edge(u,v,val));    g[u].push_back((int)edges.size()-1);}int vis[maxn],ti[maxn];ll dis[maxn];int n,m;queue<int> q;void spfa(int a){    for(int i = 0;i<=n+1;i++)        dis[i] = -inf,vis[i] = 0,ti[i] = 0;    dis[a] = 0;    while(!q.empty())        q.pop();    q.push(a);    ti[a]++;    while(!q.empty())    {        int u = q.front();        q.pop();        vis[u] = 0;         for (int i = 0; i < g[u].size(); ++i){            int id = g[u][i];            int v = edges[id].v;            ll val = edges[id].val;            if (dis[v] < dis[u] + val){                dis[v] = dis[u] + val;                if(!vis[v])                {                    ti[v]++;                    if(ti[v]>n)                        return;                    q.push(v);                    vis[v] = 1;                }            }        }    }}int main(){    int t;    scanf("%d",&t);    while(~scanf("%d",&n))    {        edges.clear();        for (int i = 0; i <= n+1; ++i){            g[i].clear();        }        for(int i = 1;i<=n;i++)        {            ll val;            scanf("%lld",&val);            add(0,i,-val);            add(i,n+1,val);        }        for(int i = 0;i<n-1;i++)        {            int u,v;            ll val;            scanf("%d%d%lld",&u,&v,&val);            add(u,v,-val);            add(v,u,-val);        }        spfa(0);        printf("%lld\n",dis[n+1]);    }    return 0;}

阅读全文
1 0
原创粉丝点击