【SDOI2009】【BZOJ1880】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

Day2

四遍最短路,然后DP一下
BZOJ炸飞,CodeVS提交的…

天理不容卡评测,还我BZOJ,还我公道!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 1510
#define GET (ch>='0'&&ch<='9')
using namespace std;
int n,m,x1,x2,y1,y2,ans;
int f[MAXN],map[MAXN][MAXN],a[MAXN][MAXN];
int dx1[MAXN],dx2[MAXN],dy1[MAXN],dy2[MAXN];
bool vis[MAXN];
void in(int &x)
{
    char ch=getchar();x=0;
    while (!GET)    ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();
}
void dijkstra(int s,int *dis)
{
    memset(vis,0,sizeof(vis));
    for (int i=1;i<=n;i++)  dis[i]=0x3f3f3f3f;
    dis[s]=0;
    for (int i=1;i<=n;i++)
    {
        int t=0,minn=0x3f3f3f3f;
        for (int j=1;j<=n;j++)  if (!vis[j]&&dis[j]<minn)   t=j,minn=dis[j];
        vis[t]=1;
        for (int j=1;j<=n;j++)  dis[j]=min(dis[j],dis[t]+map[t][j]);
    }
}
int dfs(int x)
{
    if (vis[x]) return f[x];
    vis[x]=1;
    for (int i=1;i<=n;i++)  if (a[x][i])    f[x]=max(f[x],map[x][i]+dfs(i));
    return f[x];
}
int main()
{
    in(n);in(m);in(x1);in(y1);in(x2);in(y2);int u,v,w;
    memset(map,0x3f,sizeof(map));
    for (int i=1;i<=n;i++)  map[i][i]=0;
    for (int i=1;i<=m;i++)  in(u),in(v),in(w),map[u][v]=map[v][u]=w;
    dijkstra(x1,dx1);dijkstra(y1,dy1);dijkstra(x2,dx2);dijkstra(y2,dy2);
    for (u=1;u<=n;u++)  for (v=1;v<=n;v++)
        if (u!=v&&dx1[u]+map[u][v]+dy1[v]==dx1[y1]&&(dx2[u]+map[u][v]+dy2[v]==dx2[y2]||dy2[u]+map[u][v]+dx2[v]==dx2[y2]))
            a[u][v]=1;
    memset(vis,0,sizeof(vis));
    for (int i=1;i<=n;i++)  ans=max(ans,dfs(i));
    printf("%d\n",ans);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值