transaction transaction transaction 最大费用最大流转化到SPFA最长路

//当时比赛的时候没有想到可以用SPFA做,TLE!

Problem Description

Kelukin is a businessman. Every day, he travels around cities to do some business. On August 17th, in memory of a great man, citizens will read a book named "the Man Who Changed China". Of course, Kelukin wouldn‘t miss this chance to make money, but he doesn‘t have this book. So he has to choose two city to buy and sell. 
As we know, the price of this book was different in each city. It is ai yuan in it city. Kelukin will take taxi, whose price is 1yuan per km and this fare cannot be ignored.
There are n?1 roads connecting n cities. Kelukin can choose any city to start his travel. He want to know the maximum money he can get.

Input

The first line contains an integer T (1≤T≤10) , the number of test cases. 
For each test case:
first line contains an integer n (2≤n≤100000) means the number of cities;
second line contains n numbers, the ith number means the prices in ith city; (1≤Price≤10000) 
then follows n?1 lines, each contains three numbers x, y and z which means there exists a road between x and y, the distance is zkm (1≤z≤1000).

Output

For each test case, output a single number in a line: the maximum money he can get.

Sample Input

1
4
10 40 15 30
1 2 30
1 3 2
3 4 10

Sample Output

8

Source

2017 ACM/ICPC Asia Regional Shenyang Online

Recommend

liuyiding   |   We have carefully selected several similar problems for you:  6205 6204 6203 6202 6201

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<deque>
#include<iomanip>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<functional>
#include<fstream>
#include<memory>
#include<list>
#include<string>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;

//最大费用最大流 简化到SPFA上特例
const int MAXN = 100000 + 65;
struct edge
{
    int to, next, cost;
}E[MAXN << 2];
int head[MAXN], tot, n;
int val[MAXN];
bool vis[MAXN];
int lowcost[MAXN];
void init()
{
    memset(head, -1, sizeof(head));
    tot = 0;
}
void addedge(int u, int v, int d)
{
    E[tot].to = v;
    E[tot].cost = d;
    E[tot].next = head[u];
    head[u] = tot++;
}
int spfa(int st, int ed)
{
    memset(vis, false, sizeof(vis));
    memset(lowcost, 0, sizeof(lowcost));
    queue<int> q;
    q.push(st);
    vis[st] = true;
    lowcost[st] = 0;
    while (!q.empty())
    {
        int f = q.front();
        q.pop();
        vis[f] = false;
        for (int i = head[f]; i != -1; i = E[i].next)
        {
            int v = E[i].to, d = E[i].cost;
            if (lowcost[v] < lowcost[f] + d)
            {
                lowcost[v] = lowcost[f] + d;
                if (!vis[v])
                {
                    vis[v] = true;
                    q.push(v);
                }
            }
        }
    }
    return lowcost[ed];
}
int main()
{
    int T;
    scanf("%d", &T);
    while (T--)
    {
        init();
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", &val[i]);
            addedge(0, i, val[i]);
            addedge(i, n + 1, -val[i]);
        }
        int u, v, d;
        for (int i = 0; i < n - 1; i++)
        {
            scanf("%d%d%d", &u, &v, &d);
            addedge(u, v, -d);
            addedge(v, u, -d);
        }
        printf("%d\n", spfa(0, n + 1));
    }
}
时间: 2024-10-12 11:02:09

transaction transaction transaction 最大费用最大流转化到SPFA最长路的相关文章

hdu 6437 /// 最小费用最大流 负花费 SPFA模板

题目大意: 给定n,m,K,W 表示n个小时 m场电影(分为类型A.B) K个人 若某个人连续看了两场相同类型的电影则失去W 电影时间不能重叠 接下来给定m场电影的 s t w op 表示电影的 开始时间s 结束时间t 看完这场电影则获得w 电影类型是op(0为A 1为B) 将一场电影拆成两个点 s t,两点间连线花费为-w容量为1 源点与所有电影的s点连线 花费为0容量为1 所有电影的t点与汇点连线 花费为0容量为1 若两场电影的时间不冲突 那么按时间顺序在之间连边 若类型相同 花费为W容量为

最小费用最大流解决KM匹配问题

题目:P1559 https://www.luogu.com.cn/problem/P1559 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势.由于技术配合和心理状态等各种因素影响,P[i][j]不一定等于Q[j][i].男运动员i和女运动员j配对组成混合双打的男女双方竞赛优势为P[i][j]*Q[j][i].设计一个算法,计算男女运动员最佳配对法,使各

HDU 6201 transaction transaction transaction(拆点最长路)

transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 88    Accepted Submission(s): 39 Problem Description Kelukin is a businessman. Every day, he travels around

Spring事务嵌套抛异常org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only

在业务接口中,一个方法嵌套了另外一个方法,2个方法上都加了@Transactional事务注解. 业务接口: @Service public class TransactionalTestServiceImpl implements TransactionalTestService { @Autowired private TransactionalTestHandle transactionalTestHandle; @Override @Transactional public void f

ACdream-1171 Matrix sum, 最大费用最大流

Matrix sum Time Limit: 8000/4000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticNext Problem Problem Description sweet和zero在玩矩阵游戏,sweet画了一个N * M的矩阵,矩阵的每个格子有一个整数.zero给出N个数Ki,和M个数Kj,zero要求sweet选出一些数,满足从第 i 行至少选出了Ki个数,第j列至少选出了K

HDU 3395 Special Fish 最“大”费用最大流

求最大费用可以将边权取负以转化成求最小费用.然而此时依然不对,因为会优先寻找最大流,但是答案并不一定出现在满流的时候.所以要加一些边(下图中的红边)使其在答案出现时满流.设所有边的流量为1,花费如下图所示.显然最大花费是1001,而没有红边的情况下会得到3. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio>

poj_2315 最小费用最大流

题目大意 一个图上有N个顶点,从1到N标号,顶点之间存在一些无向边,边有长度,要求从顶点1走到顶点N,再从顶点N走回顶点1,其中不必要经过每个顶点,但是要求走的路径上的边只能经过一次.求出从1--->N-->1的路径的长度最小值. 题目分析 每条无向边最多只能走一次,可以视为这些边的容量只有1.题目中要求从顶点1走到N再走回顶点1,其中经过的边只能走一次,其实可以看做从顶点1出发的两条不同的路径(路径的边不能有重合)到达顶点N.那么就可以视为,从顶点1出发到达顶点N的总流量为2. 题目要求总路

Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的时间,每一个核在不同一时候间处理同一个工作的花费是递增的,每一个核一次仅仅能处理一个工作,求运用k个核处理这n个工作的最小花费. 分析: 分析可知,求处理全部工作的最小花费,而每次选择怎么处理我们能够通过容量都为1的边来让网络流处理,这样就转化为最小费用最大流. 首先设一个超级源点s,连接全部的工作

最小费用最大流粗解 poj2516

最小费用最大流,一般解法如下: 在流量基础上,每条边还有权费用,即单位流量下的所需费用.在最大流量下,求最小费用.解法:在最大流算法基础上,每次按可行流增广改为每次用spfa按最小费用(用单位费用)增广,每次按每条边一单位费用求到达终点的最小费用(最短路),那么每次找到"最短路"(只是一条路,不是多条(dinic每次可以增广多条)),之后按这条路最大 可能流量增广(取这条路上残量最小的),直到无法增广为止.(实现细节点代码备注). 该题题意:m个供应地向n个商店供应k种物品,对于每种物