1880: [Sdoi2009]Elaxia的路线

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

【分析】

  题意就是求最短路的最长交。

  我们先做两次最短路求出最短路树(其实是拓扑图),然后交边给值,然后我再跑一遍最长路就好了。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 2010
#define Maxm 500010
#define INF 0xfffffff int n; struct node
{
int x,y,c,next;
}t[Maxm*],tt[Maxm*];
int first[Maxn],len; void ins(int x,int y,int c)
{
t[++len].x=x;t[len].y=y;t[len].c=c;
t[len].next=first[x];first[x]=len;
} int x1,y1,x2,y2;
int st,ed; queue<int > q; int dis[][Maxn];
bool inq[Maxn];
void spfa(int k)
{
while(!q.empty()) q.pop();
memset(dis[k],,sizeof(dis[k]));
memset(inq,,sizeof(inq));
inq[st]=;q.push(st);dis[k][st]=;
while(!q.empty())
{
int x=q.front();
for(int i=first[x];i;i=t[i].next)
{
int y=t[i].y;
if(dis[k][y]>dis[k][x]+t[i].c)
{
dis[k][y]=dis[k][x]+t[i].c;
if(!inq[y])
{
q.push(y);
inq[y]=;
}
}
}
q.pop();inq[x]=;
}
} void spfa2(int k)
{
while(!q.empty()) q.pop();
// memset(dis[k],63,sizeof(dis[k]));
for(int i=;i<=n;i++) dis[k][i]=-INF;
memset(inq,,sizeof(inq));
inq[st]=;q.push(st);dis[k][st]=;
while(!q.empty())
{
int x=q.front();
for(int i=first[x];i;i=t[i].next)
{
int y=t[i].y;
if(dis[k][y]<dis[k][x]+t[i].c)
{
dis[k][y]=dis[k][x]+t[i].c;
if(!inq[y])
{
q.push(y);
inq[y]=;
}
}
}
q.pop();inq[x]=;
}
} bool pd(int x)
{
if(dis[][tt[x].y]+dis[][tt[x].y]!=dis[][y2]||dis[][tt[x].x]+dis[][tt[x].x]!=dis[][y2]) return ;
if(dis[][tt[x].x]==dis[][tt[x].y]+tt[x].c) return ;
if(dis[][tt[x].y]==dis[][tt[x].x]+tt[x].c) return ;
return ;
} int main()
{
int m;
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
len=;
for(int i=;i<=m;i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
ins(x,y,c);ins(y,x,c);
}
int ans1,ans2;
st=x1;spfa();
st=x2;spfa();
// st=y1;spfa(2);
st=y2;spfa();
// for(int i=1;i<=n;i++) printf("%d ",dis[0][i]);printf("\n");
// for(int i=1;i<=n;i++) printf("%d ",dis[1][i]);printf("\n");
st=n+,ed=st+;
memset(first,,sizeof(first));
int ln=len;len=;
// tt=t;
for(int i=;i<=ln;i++) tt[i]=t[i];
for(int i=;i<=ln;i++)
{
if(pd(i)&&dis[][tt[i].y]==dis[][tt[i].x]+tt[i].c)
{
ins(tt[i].x,tt[i].y,tt[i].c);
}
else if(dis[][tt[i].y]==dis[][tt[i].x]+tt[i].c)
{
ins(tt[i].x,tt[i].y,);
}
}
// for(int i=1;i<=len;i++) printf("%d %d %d\n",t[i].x,t[i].y,t[i].c);
// return 0;
// ins(st,x1,0);ins(st,x2,0);
// ins(y1,ed,0);ins(y2,ed,0);
st=x1;ed=y1;
spfa2();
int ans=dis[][ed];
printf("%d\n",ans);
return ;
}

2017-03-05 16:01:53

【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. bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)

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

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

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

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

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

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

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

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

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

随机推荐

  1. 20155117王震宇 2006-2007-2 《Java程序设计》第一周学习总结

    20155117王震宇 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 尽量简单的总结一下本周学习内容 尽量不要抄书,浪费时间 看懂就过,看不懂,学习有心得的 ...

  2. 2017ACM暑期多校联合训练 - Team 5 1001 HDU 6085 Rikka with Candies (模拟)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  3. MySQL join 用法

    select column1, column2 from TABLE1 join TABLE2 on 条件 # select * from table1 join table2; #两个表合成一个se ...

  4. docker安装总结 linux红帽系列

    由于Docker限制分为两个版本CE和EE,所以之前yum里面的docker是老版本,需要先进行卸载,现在的包名叫做docker-ce yum remove docker docker-common ...

  5. Opencv 配置VS2012

    开始接触图像处理有一段时间了,经过前期的调研,和相关入门知识的学习,开始接触一些图像处理应用的工具.Opencv是一个图像处理的开源库,由于其开放的协议架构,国内外很多科研机构和团队都在基于openc ...

  6. sql server 2008 r2 产品密钥

    数据中心版:PTTFM-X467G-P7RH2-3Q6CG-4DMYBDDT3B-8W62X-P9JD6-8MX7M-HWK38==================================== ...

  7. Ubuntu 10.04 分辨率调整

    最近学长们看了我的本本都在问我,显卡驱动是不是出现什么问题了···分辨率这么差.当时我的分辨率是1024X768,于是我就想修改我的屏幕分辨率改成1280X800.本来很简单的事情,我做起来却非常的曲 ...

  8. 1、CentOS 6 安装GitLab

    1.安装和配置必需的依赖项 在CentOS上将系统防火墙打开HTTP和SSH访问. sudo yum install -y curl policycoreutils-python openssh-se ...

  9. SQL:select case when 的用法

    CASE 可能是 SQL 中被误用最多的关键字之一.虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法.例如,你可以在 WHERE 子句中使用 CASE. 首先让我们看一下 CASE 的语法 ...

  10. 登陆记录utmp wtmp

    /var/log/wtmp文件的作用     /var/log/wtmp也是一个二进制文件,记录每个用户的登录次数和持续时间等信息.   查看方法:   可以用last命令输出当中内容: debian ...