la4080 Warfare And Logistics 罗列+最短
为了图。计算最短随机分ans1。和删除边缘。免费才能够获得最大和短路之间的最大分ans2,如果这两个不沟通。看作是两个点之间的最短距离l。
第一个想法是枚举每个边缘,然后运行n最短时间。但是,这种复杂性是1000*1000*100*log(100),太大了..事实上在固定起点,求出单元最短路的时候。同一时候能够求出单源最短路树,仅仅有删除的边在树上的时候。源点到任一点的最短路才会有变化,所以在每次跑单源最短路的时候,仅仅须要枚举树上的n-1条边就能够了。累加一下删除每一条边时,在当前源点的情况下。最短距离之和的添加量,最后枚举找一条添加量最大的边就能够了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const ll inf=(1LL<<61);
ll cost[2020];
int n,m;
ll l; struct HeapNode
{ ll d;
int u;
bool operator< (const HeapNode& rhs) const
{
return d>rhs.d;
}
HeapNode(){}
HeapNode(ll x,int y)
{
d=x;
u=y;
}
};
struct Edge
{
int u,v;
ll w;
bool ok;
Edge(){}
Edge(int x,int y,ll z)
{
u=x;
v=y;
w=z;
ok=true;
}
};
const int maxn=105;
struct Dij
{
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
ll d[maxn];
int p[maxn];
void init(int n)
{
this->n=n; for (int i=0; i<=n; i++)
{
G[i].clear();
}
edges.clear();
}
void addedge(int x,int y,ll z)
{
edges.push_back((Edge(x,y,z)));
m=edges.size();
G[x].push_back(m-1);
}
void dijkstra(int s)
{
priority_queue<HeapNode> q;
for (int i=0; i<=n; i++)
d[i]=inf;
d[s]=0;
memset(done,0,sizeof done);
memset(p,-1,sizeof p);
q.push(HeapNode(0,s));
while(!q.empty())
{
HeapNode x=q.top(); q.pop();
int u=x.u;
if (done[u]) continue;
done[u]=true;
for (int i=0; i<G[u].size(); i++)
{
Edge &e=edges[G[u][i]];
if (!e.ok) continue; if (d[e.v]>d[u]+e.w)
{
d[e.v]=d[u]+e.w;
p[e.v]=G[u][i];
q.push(HeapNode(d[e.v],e.v));
}
}
}
}
int tp[maxn];
ll slove(int s)
{
ll res=0;
ll add=0;
ll tmp=0;
ll maxx=0;
for (int i=1; i<=n; i++)
{
if (d[i]<inf)res+=d[i];
else res+=l;
}
memcpy(tp,p,sizeof p);
for (int i=1;i<=n; i++)
{
if (tp[i]!=-1)
{
edges[tp[i]].ok=false;
edges[tp[i]^1].ok=false;
dijkstra(s);
tmp=0;
for (int j=1; j<=n; j++)
{
if (d[j]<inf) tmp+=d[j];
else tmp+=l;
}
cost[tp[i]]+=(tmp-res);
cost[tp[i]^1]+=(tmp-res);
edges[tp[i]].ok=true;
edges[tp[i]^1].ok=true;
}
}
return res;
}
}work; int main()
{
// freopen("in.txt","r",stdin);
while (~scanf("%d%d%lld",&n,&m,&l))
{
int x,y;
ll z;
work.init(n);
for (int i=1; i<=m; i++)
{
scanf("%d%d%lld",&x,&y,&z);
work.addedge(x,y,z);
work.addedge(y,x,z);
}
memset(cost,0,sizeof cost);
ll ans=0;
for (int i=1; i<=n; i++)
{
work.dijkstra(i);
ans+=work.slove(i);
}
int id=0;
ll maxx=0;
ll ans2=0;
for (int i=0; i<work.edges.size(); i++)
{
if (cost[i]>maxx)
{
id=i;
maxx=cost[i];
}
}
work.edges[id].ok=false;
work.edges[id^1].ok=false;
for (int i=1; i<=n; i++)
{
work.dijkstra(i);
for (int j=1; j<=n; j++)
if (work.d[j]<inf) ans2+=work.d[j];
else ans2+=l;
}
cout<<ans<<" "<<ans2<<endl; }
return 0;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
la4080 Warfare And Logistics 罗列+最短的更多相关文章
- UVA1416/LA4080 Warfare And Logistics
题目大意:有N个点,M条路,如果两条路不连通的话,就将这两条路的距离设置为L 现在要求你求出每两点之间的最短距离和 接着要求 求出炸断 给出的M条路中的一条路后,每两点之间的最短距离和的最大值(翻译来 ...
- 【UVA1416】(LA4080) Warfare And Logistics (单源最短路)
题目: Sample Input4 6 10001 3 21 4 42 1 32 3 33 4 14 2 2Sample Output28 38 题意: 给出n个节点m条无向边的图,每条边权都为正.令 ...
- UVALive 4080 Warfare And Logistics (最短路树)
很多的边会被删掉,需要排除一些干扰进行优化. 和UVA - 1279 Asteroid Rangers类似,本题最关键的地方在于,对于一个单源的最短路径来说,如果最短路树上的边没有改变的话,那么最短路 ...
- UVA1416 Warfare And Logistics
UVA1416 Warfare And Logistics 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36232 [ ...
- LA4080/UVa1416 Warfare And Logistics 最短路树
题目大意: 求图中两两点对最短距离之和 允许你删除一条边,让你最大化删除这个边之后的图中两两点对最短距离之和. 暴力:每次枚举删除哪条边,以每个点为源点做一次最短路,复杂度\(O(NM^2logN)\ ...
- UVA 4080 Warfare And Logistics 战争与物流 (最短路树,变形)
题意: 给一个无向图,n个点,m条边,可不连通,可重边,可多余边.两个问题,第一问:求任意点对之间最短距离之和.第二问:必须删除一条边,再求第一问,使得结果变得更大. 思路: 其实都是在求最短路的过程 ...
- uva 1416 Warfare And Logistics
题意: 给出一个无向图,定义这个无向图的花费是 其中path(i,j),是i到j的最短路. 去掉其中一条边之后,花费为c’,问c’ – c的最大值,输出c和c’. 思路: 枚举每条边,每次把这条边去掉 ...
- Warfare And Logistics UVA - 1416
题目链接:https://vjudge.net/problem/UVA-1416 题解: 这是一个最短路的好题,首先我们考虑如果暴力弗洛伊德,显然时间复杂度不对,如果做n次spfa好像复杂度也不对,所 ...
- UVA - 1416 Warfare And Logistics (最短路)
Description The army of United Nations launched a new wave of air strikes on terroristforces. The ob ...
随机推荐
- 字符集和编码II: fat/msdos/vfat (文件名乱码的问题)
具体到文件名乱码的问题,需要明确两点 第一,文件名作为一个字符串,需要被编码后存入文件系统: 第二,Linux内核无非是个特殊的应用程序,它读取文件名,再把文件名以编码后的形式传递出去. 但Linux ...
- python课程:python3函数
摘自廖雪峰的网站:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316 ...
- 【习题 5-14 UVA - 1598】Exchange
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 各组数据之间有空行! 且最后一行后面没有空行! 然后就是用set来模拟就好. 删除的时候,不着急删除. 因为并不用时刻输出集合大小. ...
- 使用GDB进行嵌入式远程调试
PC主机:Ubuntu 10.4 目标板:TQ2440开发板,linux内核2.6.30 NOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦. 使用nfs服务可以参考:S3C ...
- POJ 3086 Triangular Sums (ZOJ 2773)
http://poj.org/problem?id=3086 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1773 让你计算两 ...
- 【39.66%】【codeforces 740C】Alyona and mex
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 细说HTML头部标签
原文 简书原文:https://www.jianshu.com/p/4270b1d1037d 大纲 1.头部标签列表 2.头部标签详解 1.头部标签列表 <!DOCTYPE html> & ...
- YUV与RGB格式转换
YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...
- php解析xml字符串
<?php $content = <<<XML <?xml version="1.0" encoding="UTF-8"?> ...
- 详解springmvc控制登录用户session失效后跳转登录页面
springmvc控制登录用户session失效后跳转登录页面,废话不多少了,具体如下: 第一步,配置 web.xml <session-config> <session-timeo ...