关闭

ICPC2017网络赛(沈阳)1008&HDU6201transaction(spfa 费用流)

标签: 费用流spfa
1362人阅读 评论(4) 收藏 举报
分类:

transaction transaction transaction

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)
Total Submission(s): 31    Accepted Submission(s): 15


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 n1 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 (1T10) , the number of test cases.
For each test case:
first line contains an integer n (2n100000) means the number of cities;
second line contains n numbers, the ith number means the prices in ith city; (1Price10000)
then follows n1 lines, each contains three numbers x, y and z which means there exists a road between x and y, the distance is zkm (1z1000).
 

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
【题意】:

给出一个无向图,求从某一点到另一点的可以获得的最大利润。利润=汇点-路长-源点。

【解析】:

误打误撞,跑了n次spfa就过了。

【代码】:

#include <stdio.h>
#include <stdlib.h>  
#include <string.h>  
#include <iostream>  
#include <algorithm> 
#include <queue>  
#define mset(a,i) memset(a,i,sizeof(a))
using namespace std;
typedef long long ll;
struct node{
    int to,val,next;
}e[201010];
int n,m,x,y,val,cnt;
int head[100101];
ll dis[101001];
int a[120000];
void add(int x,int y,int v)
{
    e[cnt]=(node){ y,v,head[x] } ; 
    head[x]=cnt++;
}
void SPFA(int s)
{
    queue<int>Q;
    Q.push(s);
    while(!Q.empty())
     {
        int u=Q.front();
        Q.pop();
        for(int i=head[u];~i;i=e[i].next)
        {
            int v=e[i].to;
            if(dis[v]<dis[u]-a[u]+a[v]-e[i].val)
            {
                dis[v]=dis[u]-a[u]+a[v]-e[i].val;
                Q.push(v);
           }
        }
   }
}
int main() 
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		mset(head,-1);
		mset(dis,0);
		cnt=0;
		scanf("%d",&n) ;
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
	    for(int i=1;i<=n-1;i++)
	    {
	    	scanf("%d%d%d",&x,&y,&val);
			add(x,y,val);
	    	add(y,x,val);
		}
	    for(int i=1;i<=n;i++)
	    {
	  		SPFA(i);
		}
		ll ans=0;
		for(int i=1;i<=n;i++)
		{
			ans=max(ans,dis[i]);
		}
		printf("%lld\n",ans);
	}
    return 0 ;  
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

ICPC2017南宁邀请赛1001&&HDU6182(水

A Math ProblemYou are given a positive integer n, please count how many positive integers k satisfy k^k≤n.DescriptionYou are given a positive integer ...
  • wang2332
  • wang2332
  • 2017-09-15 21:00
  • 222

hdu6201(无向图最长路)

设置一个虚拟起点和虚拟终点,每个点与起点间一条负边,值为这个点书的价值的相反数(代表买书花钱),每个点与终点连一条正边,值为这个点的书的价格(代表卖书赚钱)。然后按照图中给的边建无向边,权值为负(代表路费)。然后就是跑最长路,spfa改一下松弛条件就行 #include #include #inc...
  • constbh
  • constbh
  • 2017-09-12 21:26
  • 239

HDU 6201 transaction transaction transaction【树形DP||SPFA最长路】

HDU 6201 transaction transaction transaction【树形DP||SPFA最长路】 Kelukin is a businessman.Every day, he travels around cities to do some business. On Augus...
  • my_sunshine26
  • my_sunshine26
  • 2017-09-10 18:45
  • 601

网络流之费用流

求费用流目前好像只有EK+SPFA改版,时间复杂度为O(N*E*k),其中K为最大流值。但时间上的期望时间复杂度为:O(A*E*K),其中A为所有顶点进队列的平均次数,可以证明A一般小于等于2。 最小费用最大流: #include using namespace std; const int ...
  • yo_bc
  • yo_bc
  • 2017-06-06 12:57
  • 261

BZOJ1070 修车(zkw费用流 or spfa费用流)

1070: [SCOI2007]修车Time Limit: 1 Sec Memory Limit: 128 MB Submit: 4900 Solved: 2009 [Submit][Status][Discuss] Description  同一时刻有N位车主带着他们的爱车来到了汽车维修中心。...
  • Viscu
  • Viscu
  • 2016-12-11 18:16
  • 415

最大流(SAP)及最小费用最大流(SPFA)模版

最小费用最大流 模版 一、最小费用最大流的模型 在保证流量最大的前提下,所需的费用最小,这就是最小费用最大流问题.   带有费用的网络流图: G=(V,E,C,W) V:顶点; E:弧;C:弧的容量;W:单位流量费用。 任意的弧对应非负的容量c[i,j]和单位流量费用w[i,j]。...
  • Dinivity123
  • Dinivity123
  • 2013-07-28 16:38
  • 2398

POJ 2175 Evacuation Plan (费用流,负环,消圈法,SPFA)

http://poj.org/problem?id=2175 Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions...
  • u012965890
  • u012965890
  • 2014-08-08 10:03
  • 2019

poj 2516 Minimum(SPFA解决最小费用最大流)

Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 16007   Accepted: 5614 Description ...
  • a15110103117
  • a15110103117
  • 2016-09-26 19:10
  • 134

费用流SPFA版

#include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned long long ull; const...
  • Dan__ge
  • Dan__ge
  • 2016-09-14 15:07
  • 755

费用流模板——SPFA

先解释一下费用流:对于一个网络, 我们可能会有多组最大流, 现在我们给每条边附上一个费用系数, 每条边产生的费用 = 这条边的流量 × 这条边的费用系数,常见的问题是求最小费用最大流。
  • Cold_Chair
  • Cold_Chair
  • 2017-03-29 12:52
  • 179
    个人资料
    • 访问:94250次
    • 积分:2811
    • 等级:
    • 排名:第14737名
    • 原创:185篇
    • 转载:9篇
    • 译文:0篇
    • 评论:33条
    博客专栏
    最新评论