bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)
1880: [Sdoi2009]Elaxia的路线
Time Limit: 4 Sec Memory Limit: 64 MB
Submit: 1944 Solved: 759
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 6 7 8
1 2 1
2 5 2
2 3 3
3 4 2
3 9 5
4 5 3
4 6 4
4 7 2
5 8 1
7 9 1
Sample Output
HINT
对于30%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。
Source
/*
如何求两对点最短路的最长公共路径?
开始的想法是对两个起点spfa,但对于如何求多条最短路经过的所有点没有思路
注意到其实本质是求最长路,只是需要一个图......
正解是4遍spfa,若某条边满足起点和终点分别到这条边最短路+这条路长等于起点到终点的最短路
那么这条边一定在最短路上。
所以就可以把1,2最短路径都经过的边重建图(注意若某条边不是被同向经过也要算)
这就有图了...求最长路即可(显然图是DAG 拓扑排序可以求)。
*/
#include<bits/stdc++.h> #define N 2005
#define M 1000007
#define inf 0x3f3f3f3f using namespace std;
struct node{
int u,v,w,nxt,f;
}e[M<<],E[M<<];
queue<int>q;
int n,m,cnt,cnt2;
int head[N],p[],d[][N],Head[N];
int in[N],f[N],v[N]; void add(int u,int v,int w)
{
e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w;
e[cnt].nxt=head[u]; head[u]=cnt;
} void add_(int u,int v,int w)
{
E[++cnt2].u=u;E[cnt2].v=v;E[cnt2].w=w;
E[cnt2].nxt=Head[u]; Head[u]=cnt2;
} void spfa(int x)
{
memset(v,,sizeof v);
for(int i=;i<=n;++i) if(i!=p[x]) d[x][i]=inf;
q.push(p[x]);v[p[x]]=;
while(!q.empty())
{
int now=q.front();q.pop();v[now]=;
for(int i=head[now];i;i=e[i].nxt)
{
int to=e[i].v;
if(d[x][to]>d[x][now]+e[i].w)
{
d[x][to]=d[x][now]+e[i].w;
if(!v[to]) v[to]=,q.push(to);
}
}
}
} void rebuild()
{
for(int i=;i<=cnt;++i)
if(d[][e[i].u]+e[i].w+d[][e[i].v]==d[][p[]])
{
add_(e[i].u,e[i].v,e[i].w);
if(d[][e[i].u]+e[i].w+d[][e[i].v]==d[][p[]] || d[][e[i].u]+e[i].w+d[][e[i].v]==d[][p[]])
E[cnt2].f=;
in[e[i].v]++;
}
} void Tsort()
{
while(!q.empty()) q.pop();
q.push(p[]);
int now;
while(!q.empty())
{
now=q.front(); q.pop();
for(int i=Head[now];i;i=E[i].nxt)
{
--in[E[i].v];
if(!in[E[i].v])
{
q.push(E[i].v);
f[E[i].v]=max(f[E[i].v],f[now]+E[i].w*E[i].f);
}
}
}
} int main()
{
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=;i<=;++i) scanf("%d",&p[i]);
for(int i=;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z),add(y,x,z);
}
for(int i=;i<=;++i) spfa(i);
rebuild();
Tsort();
printf("%d",f[p[]]);
return ;
}
bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)的更多相关文章
- [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)
Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...
- [luogu2149][bzoj1880][SDOI2009]Elaxia的路线【拓扑排序+最短路+DP】
题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间 ...
- BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2049 Solved: 805 题目链接:https ...
- BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)
Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...
- BZOJ1880: [Sdoi2009]Elaxia的路线
题意:求最短路最长公共距离. 考虑每一条边,如果满足dis(s1,u)+len+dis(v,t1)==dis(s1,t1) && dis(s2,u)+len+dis(v,t2)==di ...
- BZOJ1880 [Sdoi2009]Elaxia的路线 【最短路 + dp】
题目 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提 ...
- 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)
[SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...
- BZOJ-1880 Elaxia的路线 SPFA+枚举
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 921 Solved: 354 [Submit][Sta ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)
[BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...
随机推荐
- hihoCoder #1162 : 骨牌覆盖问题·三
#1162 : 骨牌覆盖问题·三 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 前两周里,我们讲解了2xN,3xN骨牌 ...
- POJ-1988Cube Stacking/HDU-2818Building Block;
Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 23283 Accepted: 8166 Ca ...
- ORACLE ASH/AWR
(一) ASH 用户在ORACLE数据库中执行操作时,必然要创建相应的连接和会话,其中,所有当前的会话信息都保存在动态性能视图V$SESSION中,通过该视图,DBA可以查看用户实际执行的操作,或者当 ...
- 【HDOJ5713】K个联通块(状压DP,计数)
题意:有一张无重边的无向图, 求有多少个边集,使得删掉边集里的边后,图里恰好有K个连通块. 1≤T≤201≤K≤N≤140≤M≤N∗(N+1)/21≤a,b≤N 思路:From http://blog ...
- ZOJ - 3829 Known Notation(模拟+贪心)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 给定一个字符串(只包含数字和星号)可以在字符串的任意位置添加一个数字 ...
- nyoj_758_分苹果
分苹果 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法? (注意:假如有3个盘子7 ...
- C语言事实上不简单:数组与指针
之前在写C的时候,没怎么留意数组.就这么定义一个.然后颠来倒去的使用即可了.只是后来碰到了点问题.解决后决定写这么一篇博客,数组离不开指针.索性就放一起好了. 如今我定义了一个数组:int cc[10 ...
- antd 的 Table 遇到的 bug
1.报错情况 /* autoprefixer: off */ filter: progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1, Mak ...
- HDU 4869 Turn the pokers (2014多校联合训练第一场1009) 解题报告(维护区间 + 组合数)
Turn the pokers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- bootstrap 时间控件
近期使用了bootstrap的UI感觉确实非常美丽,非常值得学习和使用. 以下先简单了解下bootstrap的时间控件. 这个时间控件使用起来还是很的简单.仅仅须要引入主要的css和js就能够了 须要 ...