题目描述

最近,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. 浅谈MySQL引擎(纯个人理解,如有错误请指正)

    MySQL有很多引擎,MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERATED...等等 比较常用的就是InnoDB和MyI ...

  2. 使用xshell连接服务器,数字键盘无法使用解决办法

    打开会话管理器,选中需要设置的服务器连接,右键->属性 选中 终端->VT模式->初始数字键盘模式->设为普通 保存,重新连接即可.

  3. mybatis 缓存的使用, 看这篇就够了

    目录 1 一级缓存 1.1 同一个 SqlSession 1.2 不同的 SqlSession 1.3 刷新缓存 1.4 总结 2 二级缓存 2.1 配置二级缓存 2.2 使用二级缓存 2.3 配置详 ...

  4. 我的物联网项目专题移到网站:http://51jdk.com

    我的物联网项目专题移到网站:http://51jdk.com

  5. centos6下ActiveMQ+Zookeeper消息中间件集群部署记录

    由于最近一个项目并发请求压力比较大,所以考虑改进架构,引入消息中间件集群作为一个缓冲消息队列,具体需求:1)将大量的WebService请求报文发送到mq集群之中,并保持消息先后顺序2)保证每个消息的 ...

  6. Mac下通过VMware Fusion安装centos虚拟机操作记录

    下面介绍下利用VMware Fusion工具在Mac上安装centos虚拟机的做法:1)下载VMware Fusion工具下载地址(包括注册码):http://www.macx.cn/thread-2 ...

  7. apache工作模式总结及网站访问缓慢处理记录

    apache目前主要有两种模式:prefork模式和worker模式:1)prefork模式(默认模式)prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程.每个 ...

  8. 项目开发之package.json

    Name 必须字段. 提示: 不要在name中包含js, node字样: 这个名字不能以点号或下划线开头: 这个名字不能包含有大写字母: 这个名字可能在require()方法中被调用,所以应该尽可能短 ...

  9. PHP magic_quotes_gpc 和 addslashes解析

    默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET.POST 和 COOKIE 数据自动运行 addslashes().不要对已经被 magic_quote ...

  10. 个人阅读作业——软件工程M1/M2的总结

    临近学期末,本学期的软件工程课也已经结束了,在此我对软件工程课中,我们团队M1和M2开发阶段中,我做的工作做一个总结 我是DEV,主要工作是等着上级给我分配任务,但是很多时候如果这个活我不干,其他人就 ...