题目描述

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

解法

对于以四个点为起点,跑四边最短路,重新建图,跑拓扑排序+DP

ac代码

# include <bits/stdc++.h>
# define LL long long
# define ms(a,b) memset(a,b,sizeof(a))
# define ri (register int)
# define inf 0x3f3f3f3f
# define pb push_back
# define dd double
# define fi first
# define se second
# define pii pair<int,int>
# define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
inline int gi(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
# define M 500005
# define N 1505
struct edge{
    int u,to,nt,w;
}E[M<<1],E1[M<<1];
int H[N],H1[N],dist[10][N],a[N],ind[N],ans[N];
bool vis[N];
int n,m,cnt,cnt1,res;
void addedge(int u,int v,int w){
    E[++cnt]=(edge){u,v,H[u],w}; H[u]=cnt;
}
void addedge_1(int u,int v,int w){
    if (dist[1][u]>dist[1][v]) swap(u,v);
    E1[++cnt1]=(edge){u,v,H1[u],w}; H1[u]=cnt1; ind[v]++;
}
void spfa(int id){
    queue<int>q;
    while (!q.empty()) q.pop();
    ms(vis,0);
    dist[id][a[id]]=0;
    q.push(a[id]);
    while (!q.empty()){
        int u=q.front(); q.pop(); vis[u]=0;
        for (int e=H[u];e;e=E[e].nt){
            int v=E[e].to;
            if (dist[id][v]>dist[id][u]+E[e].w){
                dist[id][v]=dist[id][u]+E[e].w;
                if (!vis[v]) vis[v]=1,q.push(v);
            }
        }
    }
}
void topo(){
    queue<int>q1; while (!q1.empty()) q1.pop();
    for (int i=1;i<=n;i++) if (!ind[i]) q1.push(i);
    while (!q1.empty()){
        int u=q1.front(); q1.pop();
        for (int e=H1[u];e;e=E1[e].nt){
            int v=E1[e].to; ind[v]--;
            ans[v]=max(ans[v],ans[u]+E1[e].w);
            res=max(res,ans[v]);
            if (!ind[v]) q1.push(v);
        }
    }
}
int main(){
    n=gi(),m=gi(); ms(dist,inf);
    for (int i=1;i<=4;i++) a[i]=gi();
    for (int i=1;i<=m;i++){
        int u=gi(),v=gi(),w=gi();
        addedge(u,v,w); addedge(v,u,w);
    }
    for (int i=1;i<=4;i++) spfa(i);
    for (int i=1;i<=cnt;i+=2){
        int u=E[i].u,v=E[i].to;
        if((dist[1][u]+E[i].w+dist[2][v]==dist[1][a[2]]||dist[1][v]+E[i].w+dist[2][u]==dist[1][a[2]])&&(dist[3][u]+E[i].w+dist[4][v]==dist[3][a[4]]||dist[3][v]+E[i].w+dist[4][u]==dist[3][a[4]])) addedge_1(u,v,E[i].w);
    }
    topo();
    printf("%d\n",res);
    return 0;
}

[luogu2149][bzoj1880][SDOI2009]Elaxia的路线【拓扑排序+最短路+DP】的更多相关文章

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

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

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

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

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

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

  4. BZOJ1880: [Sdoi2009]Elaxia的路线

    题意:求最短路最长公共距离. 考虑每一条边,如果满足dis(s1,u)+len+dis(v,t1)==dis(s1,t1) && dis(s2,u)+len+dis(v,t2)==di ...

  5. [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)

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

  6. BZOJ1880 [Sdoi2009]Elaxia的路线 【最短路 + dp】

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

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

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

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

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

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

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

随机推荐

  1. java异步编程降低延迟

    目录 java异步编程降低延迟 一.ExecutorService和CompletionService 二.CompletableFuture(重要) 三.stream中的parallel(并行流) ...

  2. koa2入门(3)mongoose 增删改查

    项目地址:https://github.com/caochangkui/demo/tree/koa-mongoose 连接数据库 数据库名字为:koa-mongoose const mongoose ...

  3. REST-framework快速构建API--分页

    分页简介 当数据量特别大的时候,我们通过API获取数据会非常慢,所以此时我们需要将数据"分批次"取出来,这里的"分批次"就是,分页! REST框架支持自定义分页 ...

  4. [UWP 自定义控件]了解模板化控件(5.1):TemplatePart vs. VisualState

    1. TemplatePart vs. VisualState 在前面两篇文章中分别使用了TemplatePart及VisualState的方式实现了相同的功能,其中明显VisualState的方式更 ...

  5. 利用 John the Ripper 破解用户登录密码

    一.什么是 John the Ripper ? 看到这个标题,想必大家都很好奇,John the Ripper 是个什么东西呢?如果直译其名字的话就是: John 的撕裂者(工具). 相比大家都会觉得 ...

  6. shell脚本之特殊符号总结性梳理

    # 井号 (comments) 这几乎是个满场都有的符号#!/bin/bash 井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行. # This line ...

  7. jenkins中配置svn 出现absolute path is not allowed

    代码: 兵马未动,粮草先行 作者: 传说中的汽水枪 如有错误,请留言指正,欢迎一起探讨. 转载请注明出处. 想用jenkins作自动化部署tomcat. svn代码已经checkout到本地目录了(/ ...

  8. 1023 C. Bracket Subsequence

    传送门 [http://codeforces.com/contest/1023/problem/C] 题意 n字符串长度,k要求的字符串的长度,字符串只包含'('和')',而且这两种的数量相等,要求的 ...

  9. 第一个Sprint

    项目名字:四则运算APP 开发环境:java 团队名称:会飞的小鸟 团队成员:陈志棚  李炫宗   刘芮熔  徐侃  罗伟业 一.经过宿舍世纪讨论后我们剔除了一些不合理的设计,比如网站管理员这一部分在 ...

  10. Angular $location获取端口号

    <!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...