Time Limit: 4 Sec  Memory Limit: 64 MB

Submit: 1041  Solved: 415

[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

【题解】

假设你已经求出了他们从宿舍到各自的实验室的最短路的重叠的边。且它们构成了一个新的图G。

那么你接下来要怎么做?

要公共边最长。那么就是要求一条最长链了!最长链可以用拓扑排序的方法求得。(get 新技能)

然后解决获取重边的问题。

可以这样。以4个点(宿舍和实验室)为起点分别做4次spfa;

然后枚举每一条边

如果

spfa起点[左端点]+边权+spfa终点[右端点]

上面这个式子等于起点到终点的最短路。

那么这条边就在起点到终点的最短路上。

如果这条边分别在两个人的最短路上。则加入图G。

懂了吧。

好厉害的方法。。

queue容器和vector容器真的很方便。

【代码】

#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm> using namespace std; const int MAXN = 1600; int n, m,xx1,yy1,xx2,yy2,rudu[MAXN],ans = 0;
int disxx1[MAXN], disyy1[MAXN], disxx2[MAXN], disyy2[MAXN],tt[MAXN]; struct ed_ge
{
int u, v, w;
}; vector <ed_ge> bian;
vector <int> g[MAXN],G[MAXN];
vector <int> cost[MAXN];
queue <int> dl;
bool inque[MAXN]; void input_data()
{
scanf("%d%d", &n, &m);
scanf("%d%d%d%d", &xx1, &yy1, &xx2, &yy2);
for (int i = 1; i <= m; i++)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
ed_ge temp;
temp.u = x; temp.v = y; temp.w = z;
bian.push_back(temp);
g[x].push_back(bian.size() - 1);
temp.u = y; temp.v = x;
bian.push_back(temp);
g[y].push_back(bian.size() - 1);
}
} void spfa(int qidian, int dis[])//memset(dis)写在这里面貌似不行。
{
memset(inque, false, sizeof(inque));
dl.push(qidian);
inque[qidian] = true; dis[qidian] = 0;
while (!dl.empty())
{
int x = dl.front(); dl.pop();
inque[x] = false;
int len = g[x].size();
for (int i = 0; i <= len - 1; i++)
{
int temp =g[x][i];
int y = bian[temp].v,w = bian[temp].w;
if (dis[y] > dis[x] + w)
{
dis[y] = dis[x] + w;
if (!inque[y])
{
inque[y] = true;
dl.push(y);
}
}
}
}
} void get_ans()
{
memset(disxx1, 127 / 3, sizeof(disxx1));
memset(disyy1, 127 / 3, sizeof(disxx1));
memset(disxx2, 127 / 3, sizeof(disxx1));
memset(disyy2, 127 / 3, sizeof(disxx1));
spfa(xx1, disxx1); spfa(yy1, disyy1);//4个key点开始进行最短路
spfa(xx2, disxx2); spfa(yy2, disyy2);
int len = bian.size();
for (int i = 0; i <= len-1; i++)//判断这条边是不是同时在两个人的最短路上。
{
int l = bian[i].u, r = bian[i].v, w = bian[i].w;
int len1 = min(disxx1[l], disxx1[r]) + min(disyy1[l], disyy1[r]) + w;
int len2 = min(disxx2[l], disxx2[r]) + min(disyy2[l], disyy2[r]) + w;
if (len1 == disxx1[yy1] && len2 == disxx2[yy2])
{
if (disxx1[l] < disxx1[r])
{
G[l].push_back(r);
cost[l].push_back(w);
rudu[r]++;
}
}
}
for (int i = 1;i <= n;i++)//接下来进行拓扑排序求最长链
if (rudu[i] == 0)//也可以两次dfs求最长路然后获得最长链
dl.push(i);
while (!dl.empty())
{
int x = dl.front();
dl.pop();
int len = G[x].size();
for (int i = 0; i <= len - 1; i++)
{
int y = G[x][i],w = cost[x][i];
if (tt[y] < tt[x] + w)
{
tt[y] = tt[x] + w;
ans = max(ans, tt[y]);
}
rudu[y]--;
if (!rudu[y])
dl.push(y);
}
}
} void output_ans()
{
printf("%d\n", ans);
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
input_data();
get_ans();
output_ans();
return 0;
}

【39.87%】【BZOJ 1880】[Sdoi2009]Elaxia的路线的更多相关文章

  1. BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )

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

  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. 【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)

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

  6. BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2049  Solved: 805 题目链接:https ...

  7. bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1944  Solved: 759[Submit][St ...

  8. 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)

    [BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...

  9. 洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告

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

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

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

随机推荐

  1. hdu4176 水题

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #def ...

  2. 阿里云OSS同城冗余存储技术解析

    一.背景 近年来,面对数字化转型带来的挑战,越来越多的企业开始将关键业务系统上云,也有更多的业务创新在云上,帮助企业实现业务增长,这些数据已经成为企业最重要的资产.资源.对于企业来说,如何确保宝贵的数 ...

  3. 从零学React Native之09可触摸组件

    可触摸组件有: TouchableHighlight,TouchableNativeFeedback,TouchableOpacity,TouchableWithoutFeedback 1. Touc ...

  4. oracle 表空间/用户 增加删除

    create temporary tablespace user_temp tempfile 'C:\dmp\user_temp.dbf' size 50m autoextend on next 50 ...

  5. Datagrid添加右键菜单 标签: 三层EasyUI 2015-08-14 19:57 1029人阅读 评论(22)

    最近的一个项目前台使用的EasyUI,每个界面都有DataGrid控件,按照我们的想法,应该做出来的效果是单击选中,双击可编辑,当然右键也应该出现这些菜单按钮,想的挺好,那么该如何实现呢?一开始不知道 ...

  6. Java练习 SDUT-2746_大小写转换

    大小写转换 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description X现在要学习英文以及各种稀奇古怪的字符的了.现在他想把一串字 ...

  7. 22-2 模板语言的进阶和fontawesome字体的使用

    一  fontfawesome字体的使用 http://fontawesome.dashgame.com/ 官网 1 下载 2 放到你的项目下面 3 html导入这个目录 实例: class最前面的f ...

  8. CNN网络改善的方法——池化

    一个能降低卷积金字塔中特征图的空间维度,目前为止,我们通过调整步幅,将滤镜每次移动几个像素.图1 从而降低特征图的尺寸.这是降低图像采样率的一种非常有效的方法. 图1 它移除了很多信息,如果我们不采用 ...

  9. uva 10253 Series-Parallel Networks (整数划分+多重集)

    UVa Online Judge 题意是计算给定数量的边通过串联并联两种方式,能组成多少种不同的网络.将它转化为一个树形结构,也就是求有多少不同构的树. 代码如下: #include <cstd ...

  10. [kuangbin带你飞]专题九 连通图B - Network UVA - 315

    判断割点的性质: 如果点y满足 low[y]>=dfn[x] 且不是根节点 或者是根节点,满足上述式子的有两个及其以上. 就是割点 如果是起点,那么至少需要两个子节点满足上述条件,因为它是根节点 ...