SCU 1095运送物资(最短路)
SCU 1095运送物资(最短路)
X国发生了内战。起义军得到了广大人民的支持。在一次战役中,反动军队结集了大量兵力,围攻起义军的主堡W城。为支援前线,后方各个供给基地城市纷纷准备将物资运往W城。各基地及W城之间有的有公路相连。这就是说,有的基地不能将物资一次运到W城,必须通过中途的转运。
根据每条公路的长短和运送物资的多少,运送中将会有不同程度的损耗。现假设每条公路都有一个损耗系数,表示经过这条公路的物资总量与消耗量的比值。
另外,为保证物资安全到达,每个基地都会等所有要通过该基地转运的物资到齐后,连同本基地的物资一起,运到下一站。也就是说,从任何一个基地出发,都只能将物资运往另一基地,但允许多个基地的物资运往同一基地。
请编程预定出每个基地的运输路线,使到达W城的总物资最大。
输入:{input.txt}
第一行给出两个整数n(2<=n<=100)与m。其中n表示有n-1个基地(编号为1到n)与一个W城(编号为n);m表示有m条公路。
第二行给出了n-1个正整数(正整数<=50000),表示编号为1到n-1的基地要运送的物资数量。
接下来m行描述了m条公路的情况,每一行有3个数,如 1 2 0.1
表示1号城市与2号城市之间有一条公路连接,其损耗系数为0.1。
注意:数据给出的公路网,保证每个基地都能将物资运到W城。
输出:{ouput.txt}
共n行。
第一行是运到W城的最大物资数(结果保留两位小数)。
接下来n-1行分别有一个数,代表每个基地将物资运往的下一个基地或W城的编号。
样例输入
5 6
10 10 10 10
1 3 0
1 4 0
2 3 0
2 4 0
3 5 0
4 5 0
样例输出
40.00
3
3
5
5
解题报告
裸的最短路,在将边的权值表示为(1-损耗)的倒数。因为精度问题,倒数要开long double,并除以100,在计算路径时不是加而是乘。
#include<bits/stdc++.h>
#include<queue>
#include <algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define Pair pair<long double,int>
#define MAXN 1000+10
#define MAXM 600000+1
using namespace std;
int n,m,num,head[MAXN],s,t,pre[MAXN],v[MAXM];
double good[MAXN],ans;
long double dis[MAXN];
struct Edge{
int next,to,exi,from;
double dis;
}edge[MAXM];
void add(int from,int to,double dis)
{
edge[++num].next=head[from];
edge[num].to=to;
edge[num].dis=dis;
edge[num].from=from;
head[from]=num;
}
void dij()
{
memset(dis,,sizeof(dis));
memset(pre,,sizeof(pre));
memset(v,,sizeof(v));
priority_queue<Pair,vector<Pair>,greater<Pair> > h;
for(int i=;i<=n;i++) dis[i]=LONG_LONG_MAX;
dis[s]=*0.001;
h.push(Pair(dis[s],s));
while(h.size()>)
{
int k=h.top().second;h.pop();
if(v[k]) continue;
v[k]=;
for(int i=head[k];i;i=edge[i].next)
{
if(((dis[k]*edge[i].dis))<(dis[edge[i].to]))
{
dis[edge[i].to]=dis[k]*edge[i].dis;
pre[edge[i].to]=edge[i].from;
h.push(Pair(dis[edge[i].to],edge[i].to));
}
} }
}
int main()
{ scanf("%d%d",&n,&m);
for(int i=;i<=n-;i++)
scanf("%lf",&good[i]);
for(int i=;i<=m;i++)
{
int x,y;double z;
scanf("%d%d%lf",&x,&y,&z);
add(x,y,/(-z));
add(y,x,/(-z));
}
s=n;
dij();
for(int i=;i<=n-;i++)
ans+=good[i]*(0.001/dis[i]);
printf("%.2lf\n",ans);
for(int i=;i<=n-;i++)
{
printf("%d\n",pre[i]);
} return ;
}
SCU 1095运送物资(最短路)的更多相关文章
- SCU 4444: Travel(最短路)
Travel The country frog lives in has n towns which are conveniently numbered by 1,2,…,n . Among n(n− ...
- SCU 4527 NightMare2 最短路+二分 好题
可怜的又做噩梦了..但是这次跟上次不大一样,虽然他又被困在迷宫里,又被装上了一个定时炸弹,但是值得高兴的是,他发现他身边有数不清的财宝,所以他如果能带着这些财宝并活着逃出去的话,他就发财啦.不过,这次 ...
- SCU 4444 Travel (补图最短路)
Travel The country frog lives in has \(n\) towns which are conveniently numbered by \(1, 2, \dots, n ...
- POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离)
POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离) Description You have just moved from a ...
- POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...
- bzoj1001--最大流转最短路
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...
- 【USACO 3.2】Sweet Butter(最短路)
题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...
- Sicily 1031: Campus (最短路)
这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...
- BZOJ 1095: [ZJOI2007]Hide 捉迷藏
Description 一棵树,支持两个操作,修改一个点的颜色,问树上最远的两个白点距离. Sol 动态点分治. 动态点分治就是将每个重心连接起来,形成一个跟线段树类似的结构,当然它不是二叉的... ...
随机推荐
- 利用IP安全策略关闭危险端口
默认情况下,Windows服务器有很多端口是开放的,网络病毒和黑客可以通过这些端口连上你的服务器并进行攻击. 为了让你的系统变为铜墙铁壁,应该封闭这些端口,主要有:TCP 135.139.445.59 ...
- 74HC164应用
管脚定义与内部逻辑图 注:管脚一般A.B连在一起作为一个输入:CLR硬件接VDD. 原理如下:每8个CLK上升沿,bit分别从QA移至QH,所以给定一个字节,左移后送入至A/B,这样Bit7经过8个上 ...
- The Structure of an App-ios应用架构-MVC
During startup, the UIApplicationMain function sets up several key objects and starts the app runnin ...
- Dapper丶DapperExtention,以及AbpDapper之间的关系,
在一些开发上,由于系统的迭代上面,不能立即使用ABP框架一些框架,框架是死的,框架是死的,框架中的一些东西很值得我们学习.例如DDD架构设计,Dto数据传输对象,以及AutoMapper.仓储,依赖注 ...
- 用AI识别内部人威胁面临的道德规范
用AI识别内部人威胁面临的道德规范 还记得汤姆·克鲁斯的<少数派报告>吗?人工智能可识别昭示未来风险的员工行为.该如何有效且有道德地使用这一数据呢? 为保护公司网络不受恶意软件.数据渗漏和 ...
- javascript 继承之拷贝,原型,类式
// 拷贝继承,在子类内调用父类并修正this指向,再通过for in 拷贝父类的方法实现继承,具体实现如下代码 : function Tab(){//父类构造函数 this.name='aaa'; ...
- vue之computed和watch
计算属性 computed 侦听器or观察者 watch 一直以来对computed和watch一知半解,用的时候就迷迷糊糊的,今天仔细看了看文档,突然茅塞顿开,原来就是这么简单啊: computed ...
- 紫书 习题 8-13 UVa 10570 (枚举+贪心)
我看到数据范围只有500, 第一反应枚举所有的可能,然后求出每种可能的最小次数. 但是不知道怎么求最小次数.我想的是尽量让一次交换可以让两个不在应该在的位置的数字 到原来应该在的位置的数字, 这样可以 ...
- [HAOI2009]毛毛虫(树形dp)
[HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边的一个毛毛虫 ...
- 【BZOJ 1193】 [HNOI2006]马步距离
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 原问题可以等价为两个点. 然后其中一个点要移动到另外一个点. 那么我们可以把左下角那个点(对称总是可以得到一个点在左下角)放在原点的 ...