LA 4080 战争和物流(最短路树)
https://vjudge.net/problem/UVALive-4080
题意:
给出一个n个结点m条边的无向图,每条边上有一个正权。令c等于每对结点的最短路长度之和。不连通的两点的最短路长度视为L。
求出初始时的最短路长度之和以及删除一条边后最大的最短路长度之和。
思路:
最短路树其实很简单,就是用一个二维数组记录某个源点出发所经过的边,如$belong[s][i]$就说明源点s出发经过了i这条边。这样做的好处是当我们枚举删除的边的时候,如果它不在当前源点的最短路树上,那么对于最短路不会有影响,如果在,那么此时就要重新跑最短路。这样可以节约很多时间。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<bitset>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const ll INF = (ll)<<;
const int maxn=+; int n,m,tot,l;
ll ans;
int head[maxn];
bool vis[maxn],del[],belong[maxn][];
ll d[maxn],w[maxn];
int p[maxn]; struct node
{
int id,v,d,next;
}e[maxn*maxn]; struct HeapNode
{
int u; ll d;
HeapNode(int u, ll d):u(u),d(d){}
bool operator<(const HeapNode& rhs) const
{
return d>rhs.d;
}
}; void addEdge(int id, int u, int v, int d)
{
e[tot].id=id;
e[tot].d=d;
e[tot].v=v;
e[tot].next=head[u];
head[u]=tot++;
} void dijkstra1(int s)
{
priority_queue<HeapNode> Q;
memset(vis,false,sizeof(vis));
for(int i=;i<=n;i++) d[i]=INF;
d[s]=;
Q.push(HeapNode(s,));
while(!Q.empty())
{
HeapNode x=Q.top(); Q.pop();
int u=x.u;
if(vis[u]) continue;
belong[s][p[u]]=true;
vis[u]=true;
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].v;
if(d[v]>d[u]+e[i].d)
{
d[v]=d[u]+e[i].d;
p[v]=e[i].id;
Q.push(HeapNode(v,d[v]));
}
}
}
for(int i=;i<=n;i++)
{
if(d[i]==INF)
{
w[s]+=l;
ans+=l;
}
else
{
w[s]+=d[i];
ans+=d[i];
}
}
} ll dijkstra2(int s)
{
priority_queue<HeapNode> Q;
memset(vis,false,sizeof(vis));
for(int i=;i<=n;i++) d[i]=INF;
d[s]=;
Q.push(HeapNode(s,));
while(!Q.empty())
{
HeapNode x=Q.top(); Q.pop();
int u=x.u;
if(vis[u]) continue;
vis[u]=true;
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].v;
if(del[e[i].id]) continue;
if(d[v]>d[u]+e[i].d)
{
d[v]=d[u]+e[i].d;
Q.push(HeapNode(v,d[v]));
}
}
}
ll tmp=;
for(int i=;i<=n;i++)
{
if(d[i]==INF) tmp+=l;
else tmp+=d[i];
}
return tmp;
} int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d%d",&n,&m,&l))
{
tot=;
memset(head,-,sizeof(head));
memset(del,false,sizeof(del));
memset(belong,false,sizeof(belong));
memset(w,,sizeof(w));
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(i,u,v,w);
addEdge(i,v,u,w);
}
ans=;
for(int i=;i<=n;i++) dijkstra1(i);
printf("%lld ",ans);
ans=;
for(int i=;i<=m;i++)
{
ll tmp=;
del[i]=true;
for(int j=;j<=n;j++)
{
if(belong[j][i]) tmp+=dijkstra2(j);
else tmp+=w[j];
}
del[i]=false;
ans=max(ans,tmp);
}
printf("%lld\n",ans);
}
return ;
}
LA 4080 战争和物流(最短路树)的更多相关文章
- UVA 4080 Warfare And Logistics 战争与物流 (最短路树,变形)
题意: 给一个无向图,n个点,m条边,可不连通,可重边,可多余边.两个问题,第一问:求任意点对之间最短距离之和.第二问:必须删除一条边,再求第一问,使得结果变得更大. 思路: 其实都是在求最短路的过程 ...
- 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树)
layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" ca ...
- UVALive 4080 Warfare And Logistics (最短路树)
很多的边会被删掉,需要排除一些干扰进行优化. 和UVA - 1279 Asteroid Rangers类似,本题最关键的地方在于,对于一个单源的最短路径来说,如果最短路树上的边没有改变的话,那么最短路 ...
- hdu 3409 最短路树+树形dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3409 参考博客:http://www.cnblogs.com/woaishizhan/p/318981 ...
- LA4080/UVa1416 Warfare And Logistics 最短路树
题目大意: 求图中两两点对最短距离之和 允许你删除一条边,让你最大化删除这个边之后的图中两两点对最短距离之和. 暴力:每次枚举删除哪条边,以每个点为源点做一次最短路,复杂度\(O(NM^2logN)\ ...
- BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- BZOJ4356Ceoi2014 Wall——堆优化dijkstra+最短路树
题目描述 给出一个N*M的网格图,有一些方格里面存在城市,其中首都位于网格图的左上角.你可以沿着网络的边界走,要求你走的路线是一个环并且所有城市都要被你走出来的环圈起来,即想从方格图的外面走到任意一个 ...
- 51nod 1443 路径和树(最短路树)
题目链接:路径和树 题意:给定无向带权连通图,求从u开始边权和最小的最短路树,输出最小边权和. 题解:构造出最短路树,把存留下来的边权全部加起来.(跑dijkstra的时候松弛加上$ < $变成 ...
- Berland and the Shortest Paths CodeForces - 1005F(最短路树)
最短路树就是用bfs走一遍就可以了 d[v] = d[u] + 1 表示v是u的前驱边 然后遍历每个结点 存下它的前驱边 再用dfs遍历每个结点 依次取每个结点的某个前驱边即可 #include &l ...
随机推荐
- Python绘图工具matplotlib的使用(图形并茂)
matplotlib官网文档: http://matplotlib.org/gallery.html 支持win7_64_bit的matplotlib库下载网址: http://www.lfd.uci ...
- 007-spring cloud gateway-GatewayAutoConfiguration核心配置-RouteDefinition初始化加载
一.RouteDefinitionLocator 在Spring-Cloud-Gateway的GatewayAutoConfiguration初始化加载中会加载RouteDefinitionLocat ...
- 【剑指offer】跳台阶
一.题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 二.思路: 同斐波那契数列. 三.代码:
- [vue]实现父子组件数据双向绑定
参考: http://www.cnblogs.com/xxcanghai/p/6124699.html <!DOCTYPE html> <html lang="en&quo ...
- test examples/test scripts
//https://www.getpostman.com/docs/v6/postman/scripts/test_examples //Setting an environment variable ...
- iOS 开发笔记-UILable/UIFont/UIButton常见设置
UILabel的常见设置 @property(nonatomic,copy) NSString *text; 显示的文字 @property(nonatomic,retain) UIFont *fon ...
- ARM中的汇编指令
Arm指令,32位的指令集,一共有16条的基本指令,每条指令都可以按条件执行, 指令都是32bit的,高四位是条件码[31:28], Thumb指令,16位的指令集,执行效率比arm指令集要低,但是节 ...
- 每天一个Linux命令(1)ls命令
ls是list的缩写,ls命令是Linux系统下最常用的命令之一. ls命令用于打印当前目录的清单,如果指定其它目录,那么就会显示其他目录的文件及文件夹的清单. 通过ls 命令还可以查看文件其它的详细 ...
- 20145316许心远《网络对抗》MSF基础应用
20145316许心远<网络对抗>MSF基础应用 实验后回答问题 用自己的话解释什么是exploit,payload,encode. exploit:顾名思义就是攻击嘛,因为是个动词,所以 ...
- linux测试带宽命令,Linux服务器网络带宽测试iperf
linux测试带宽命令,Linux服务器网络带宽测试iperf必须先运行iperf serveriperf -s -i 2客户端iperf -c 服务端IP地址 iperf原理解析 iperf工具可以 ...