找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案

--------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
 
using namespace std;
 
const int maxn = 1509;
const int inf = 0x3f3f3f3f;
 
struct edge {
int to, w, f;
edge* next;
} E[2000000], *pt = E, *head[maxn];
 
void AddEdge(int u, int v, int w) {
pt->to = v; pt->w = w; pt->f = 0; pt->next = head[u]; head[u] = pt++;
}
 
int N, s0, t0, s1, t1, ans = 0;
int d[maxn], w[maxn], deg[maxn];
bool vis[maxn];
 
void init() {
int m;
scanf("%d%d%d%d%d%d", &N, &m, &s0, &t0, &s1, &t1);
s0--; t0--; s1--; t1--;
while(m--) {
int u, v, w; scanf("%d%d%d", &u, &v, &w); u--; v--;
AddEdge(u, v, w);
AddEdge(v, u, w);
}
}
 
struct node {
int x, d;
bool operator < (const node &o) const {
return d > o.d;
}
};
 
priority_queue<node> q;
 
void Dijkstra(int s) {
memset(d, inf, sizeof d); d[s] = 0;
q.push((node){s, 0});
while(!q.empty()) {
node o = q.top(); q.pop();
if(d[o.x] != o.d) continue;
int x = o.x;
for(edge* e = head[x]; e; e = e->next) if(d[e->to] > d[x] + e-> w) {
d[e->to] = d[x] + e->w;
q.push((node){e->to, d[e->to]});
}
}
}
 
void dfs(int x) {
if(vis[x]) return;
vis[x] = true;
for(edge* e = head[x]; e; e = e->next)
if(d[e->to] + e->w == d[x]) dfs(e->to);
}
 
void DFS(int x) {
vis[x] = true;
w[x] = 0;
for(edge* e = head[x]; e; e = e->next) if(e->f == 2 && !vis[e->to]) {
DFS(e->to);
w[x] = max(w[x], w[e->to] + e->w);
}
}
 
int main() {
init();
memset(vis, 0, sizeof vis);
Dijkstra(s0); dfs(t0);
for(int i = 0; i < N; i++) if(vis[i])
for(edge* e = head[i]; e; e = e->next)
if(d[e->to] == d[i] + e->w && vis[e->to]) e->f++;
memset(vis, 0, sizeof vis);
Dijkstra(s1); dfs(t1);
for(int i = 0; i < N; i++) if(vis[i])
for(edge* e = head[i]; e; e = e->next)
if(d[e->to] == d[i] + e->w && vis[e->to]) e->f++;
memset(vis, 0, sizeof vis);
memset(deg, 0, sizeof deg);
memset(w, 0, sizeof w);
for(int i = 0; i < N; i++)
for(edge* e = head[i]; e; e = e->next)
if(e->f == 2) deg[e->to]++;
for(int i = 0; i < N; i++) if(!deg[i]) DFS(i);
for(int i = 0; i < N; i++) ans = max(ans, w[i]);
memset(vis, 0, sizeof vis);
Dijkstra(t1); dfs(s1);
for(int i = 0; i < N; i++) if(vis[i])
for(edge* e = head[i]; e; e = e->next)
if(d[e->to] == d[i] + e->w && vis[e->to]) e->f++;
memset(vis, 0, sizeof vis);
memset(deg, 0, sizeof deg);
memset(w, 0, sizeof w);
for(int i = 0; i < N; i++)
for(edge* e = head[i]; e; e = e->next)
if(e->f == 2) deg[e->to]++;
for(int i = 0; i < N; i++) if(!deg[i]) DFS(i);
for(int i = 0; i < N; i++) ans = max(ans, w[i]);
printf("%d\n", ans);
return 0;
}

--------------------------------------------------------------------------------

1880: [Sdoi2009]Elaxia的路线

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 884  Solved: 332
[Submit][Status][Discuss]

Description

最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。Elaxia和w**每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。 现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。

Input

第一行:两个整数N和M(含义如题目描述)。 第二行:四个整数x1、y1、x2、y2(1 ≤ x1 ≤ N,1 ≤ y1 ≤ N,1 ≤ x2 ≤ N,1 ≤ ≤ N),分别表示Elaxia的宿舍和实验室及w**的宿舍和实验室的标号(两对点分别 x1,y1和x2,y2)。 接下来M行:每行三个整数,u、v、l(1 ≤ u ≤ N,1 ≤ v ≤ N,1 ≤ l ≤ 10000),表 u和v之间有一条路,经过这条路所需要的时间为l。 出出出格格格式式式::: 一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)。

Output

一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)

Sample Input

9 10
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

3

HINT

对于30%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。

Source

BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )的更多相关文章

  1. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

    [BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...

  2. bzoj 1880 [Sdoi2009]Elaxia的路线(最短路+拓扑序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  3. bzoj 1880: [Sdoi2009]Elaxia的路线

    Description 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希 ...

  4. bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】

    有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...

  5. 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)

    [SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...

  6. Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)

    P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...

  7. BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  8. Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序

    Solution 另外$ m <=5e5$. 两条最短路的 最长公共路径 一定是若干条连续的边, 并且满足拓扑序. 于是我们分别 正向 和反向走第二条路径,若该条边同时是两条最短路径上的边, 则 ...

  9. 【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)

    1880: [Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. ...

随机推荐

  1. ny 58 最少步数 (BFS)

    题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=58 就是一道简单的BFS 练习练习搜索,一次AC #include <iostream& ...

  2. JAVA的BIT数组

    写个小东西,要去重复数字,用到BIT数组,虽然JAVA已经提供了一个BitSet,不过自己手痒,又写了一个简单的 原理就不写了,网上一大堆 import java.util.Iterator; imp ...

  3. ComboBox控件绑定数据源

    最近在研究机房收费系统的组合查询的方法时,看到了ComboBox控件可以进行数据绑定,我觉得这个功能真的很不错,可以给我省去很多的麻烦. 下面是我组合查询窗体界面 一.数据转换方法 现在我们开看一下我 ...

  4. elk 数据存储

    让我们在集群中唯一一个空节点上创建一个叫做blogs的索引,默认情况下,一个索引被分配5个主分片, 但是为了演示的目的, 我们只分配3个主分片和一个复制分片(每个主分片都有一个复制分片): PUT / ...

  5. Windows Azure 新上线网络相关服务

     动态路由网关.点到站点(Point to Site)VPN正式商用 动态路由网关和点到站点VPN支持基于路由的VPN,并且允许用户将独立计算机连接到Azure上的虚拟网络.现在,虚拟网络中的动态 ...

  6. Static block start new thread

    Static block start new thread public class StaticThreadInit { static{ Threadt = newThread(){ public ...

  7. Linux系统编程——进程调度浅析

    概述 操作系统要实现多进程.进程调度不可缺少. 有人说,进程调度是操作系统中最为重要的一个部分.我认为这样的说法说得太绝对了一点,就像非常多人动辄就说"某某函数比某某函数效率高XX倍&quo ...

  8. hdu2554-N对数的排列问题

    http://acm.hdu.edu.cn/showproblem.php?pid=2554 假设所有的2n个数据的位置分别从1~2n标号. 现在假设其中第ai个数据(双胞胎),和bi.那么他们的位置 ...

  9. 在基类中的析构函数声明为virtual

    #include <iostream> using namespace std; class Father { public: ~Father() { cout << &quo ...

  10. unity 播放外部视频

    摘要: Unity支持的播放视频格式有.mov..mpg..mpeg..mp4..avi和.asf.只需将对应的视频文件拖拽入Project视图即可,它会自动生成对应的MovieTexture对象. ...