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 战争和物流(最短路树)的更多相关文章

  1. UVA 4080 Warfare And Logistics 战争与物流 (最短路树,变形)

    题意: 给一个无向图,n个点,m条边,可不连通,可重边,可多余边.两个问题,第一问:求任意点对之间最短距离之和.第二问:必须删除一条边,再求第一问,使得结果变得更大. 思路: 其实都是在求最短路的过程 ...

  2. 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树)

    layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" ca ...

  3. UVALive 4080 Warfare And Logistics (最短路树)

    很多的边会被删掉,需要排除一些干扰进行优化. 和UVA - 1279 Asteroid Rangers类似,本题最关键的地方在于,对于一个单源的最短路径来说,如果最短路树上的边没有改变的话,那么最短路 ...

  4. hdu 3409 最短路树+树形dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3409 参考博客:http://www.cnblogs.com/woaishizhan/p/318981 ...

  5. LA4080/UVa1416 Warfare And Logistics 最短路树

    题目大意: 求图中两两点对最短距离之和 允许你删除一条边,让你最大化删除这个边之后的图中两两点对最短距离之和. 暴力:每次枚举删除哪条边,以每个点为源点做一次最短路,复杂度\(O(NM^2logN)\ ...

  6. BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  7. BZOJ4356Ceoi2014 Wall——堆优化dijkstra+最短路树

    题目描述 给出一个N*M的网格图,有一些方格里面存在城市,其中首都位于网格图的左上角.你可以沿着网络的边界走,要求你走的路线是一个环并且所有城市都要被你走出来的环圈起来,即想从方格图的外面走到任意一个 ...

  8. 51nod 1443 路径和树(最短路树)

    题目链接:路径和树 题意:给定无向带权连通图,求从u开始边权和最小的最短路树,输出最小边权和. 题解:构造出最短路树,把存留下来的边权全部加起来.(跑dijkstra的时候松弛加上$ < $变成 ...

  9. Berland and the Shortest Paths CodeForces - 1005F(最短路树)

    最短路树就是用bfs走一遍就可以了 d[v] = d[u] + 1 表示v是u的前驱边 然后遍历每个结点 存下它的前驱边 再用dfs遍历每个结点 依次取每个结点的某个前驱边即可 #include &l ...

随机推荐

  1. 开源的挖矿软件,sha256

    http://cryptomining-blog.com/tag/sha-256d-miner/ https://github.com/cbuchner1/CudaMiner/blob/master/ ...

  2. python中operator.itemgetter函数

    operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. k = [,,] b = ) print(b(k)) #输 ...

  3. SVN出现xcrun: error: invalid active developer path(Mac)

    Mac升级了系统,配置PHPStorm的SVN,出现如下错误: 具体提示的内容是:xcrun: error: invalid active developer path (/Library/Devel ...

  4. 机器学习理论基础学习12---MCMC

    作为一种随机采样方法,马尔科夫链蒙特卡罗(Markov Chain Monte Carlo,以下简称MCMC)在机器学习,深度学习以及自然语言处理等领域都有广泛的应用,是很多复杂算法求解的基础.比如分 ...

  5. Ajax—web中ajax的常用方式

    什么Web2.0的特点? 1:注重用户贡献度 2:内容聚合RSS协议(每小块都个性化,单独加载单独请求,不用全部刷新--Ajax) 3:更丰富的用户体验 Ajax的概念? "Asynchro ...

  6. ATG精准科技-前端面试题

    1.请写出以下结果 for(var i=0; i<10; i++){ setTimeout(function () { console.log(i) },10) } 结果:打印10次190解析: ...

  7. cf 459E

    cf459E 这题说的是 给定一个n点m条边的带边权的有向图,从中找出一条路径(可以带环),该路径包含的边数最多,并且要求路径中的权值必须严格递增,然后对边进行排序完个后采用dp去解特殊判断一下边权值 ...

  8. [Data Access] ORM 原理 (11): 效能議題

    這絕對是 ORM 的使用者,開發人員與 DBAs 共同想要問的議題,到底我使用了 ORM 和使用傳統的 ADO.NET 下 SQL 指令的方式會差多少? 這個問題不但會發生在 Entity Frame ...

  9. 【转】Java中Synchronized的用法

    <编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下Java线程同步中的一 ...

  10. HTML5代码规范

    HTML5代码规范html标签里面等号两边不要留空格在IE下可能会识别不了html5等号前后可以使用空格,但仍不推荐使用. HTML 代码约定很多 Web 开发人员对 HTML 的代码规范知之甚少.在 ...