懒得复制,戳我戳我

Solution:

  • 题目大概意思就是找两条最短路后,找出最长公共部分
  • 我们就只用以四个点为源点开始走\(SPFA\),然后我们就只用遍历每条边然后建立一个新的拓扑图,然后随便搞一下就出来了
  • 另外在建新图时不要跑边入队,不然一次性入队的点太多就会爆炸,只用遍历每一条边,然后把公共边从距离小的点连向距离大的点就行了
  • 最后面就是一遍拓扑序dp一下

Code:

//It is coded by Ning_Mew on 4.6
#include<bits/stdc++.h>
using namespace std; const int maxn=1507;
const int maxm=1507*1507; int n,m,ans;
int s[3],t[3];
int head[maxn],cnt=0,hd[maxn],ct=0;
struct Edge{
int from,dis,to,nxt;
}edge[maxm],ee[maxm];
int dist[5][maxn],vis[maxn],in[maxn],dp[maxn];
bool instack[maxn]; void add(int from,int to,int dis,int num){
if(num==1){
edge[++cnt].nxt=head[from];
edge[cnt].from=from;
edge[cnt].to=to;
edge[cnt].dis=dis;
head[from]=cnt;
}else{
ee[++ct].nxt=hd[from];
ee[ct].to=to;
ee[ct].dis=dis;
hd[from]=ct;
}return;
}
void SPFA(int k,int ls,int num){
queue<int>Q; while(!Q.empty())Q.pop();
Q.push(k);vis[k]=ls;
dist[num][k]=0;
while(!Q.empty()){
int u=Q.front();Q.pop();vis[u]=ls-1;
for(int i=head[u];i!=0;i=edge[i].nxt){
int v=edge[i].to;
if(dist[num][v]>dist[num][u]+edge[i].dis){
dist[num][v]=dist[num][u]+edge[i].dis;
if(vis[v]!=ls){
Q.push(v);vis[v]=ls;
}
}
}
}
}
void find(){
for(int i=1;i<=cnt;i+=2){
int u=edge[i].from,v=edge[i].to,dis=edge[i].dis;
bool in1=false,in2=false;
if(dist[1][u]+dis+dist[2][v]==dist[1][ t[1] ]||dist[2][u]+dis+dist[1][v]==dist[1][ t[1] ])in1=true;
if(dist[3][u]+dis+dist[4][v]==dist[3][ t[2] ]||dist[4][u]+dis+dist[3][v]==dist[3][ t[2] ])in2=true;
if(in1&&in2){
if(dist[1][u]<dist[1][v])add(u,v,dis,2),in[v]++,instack[u]=true,instack[v]=true;
else add(v,u,dis,2),in[u]++,instack[u]=true,instack[v]=true;
}
}return;
}
void topsort(){
memset(dp,-0x5f,sizeof(dp));
queue<int>Q;while(!Q.empty())Q.pop();
for(int i=1;i<=n;i++){
if(instack[i]&&in[i]==0)Q.push(i),dp[i]=0;
}
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=hd[u];i!=0;i=ee[i].nxt){
int v=ee[i].to;
in[v]--;if(in[v]==0)Q.push(v);
dp[v]=max(dp[v],dp[u]+ee[i].dis);
}
}return;
}
int main(){
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&s[1],&t[1],&s[2],&t[2]);
for(int i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);add(x,y,z,1);add(y,x,z,1);}
//cout<<"build finished!"<<endl;
memset(instack,false,sizeof(instack));
memset(dist,0x5f,sizeof(dist));
SPFA(s[1],2,1); SPFA(t[1],2,2); SPFA(s[2],3,3); SPFA(t[2],3,4);
//for(int i=1;i<=n;i++)cout<<i<<" dist:"<<dist[1][i]<<" dist2:"<<dist[2][i]<<endl;cout<<endl;
//for(int i=1;i<=n;i++)cout<<i<<" dist:"<<dist[3][i]<<" dist2:"<<dist[4][i]<<endl;
find();
topsort();
ans=-0x5f;
for(int i=1;i<=n;i++){ans=max(ans,dp[i]);}
printf("%d\n",ans);
return 0;
}

【题解】 [SDOI2009] Elaxia的路线(最短路+拓扑排序)的更多相关文章

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

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

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

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

  3. Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序

    Solution 另外$ m <=5e5$. 两条最短路的 最长公共路径 一定是若干条连续的边, 并且满足拓扑序. 于是我们分别 正向 和反向走第二条路径,若该条边同时是两条最短路径上的边, 则 ...

  4. bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】

    有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...

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

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

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

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

  7. Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)

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

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

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

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

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

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

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

随机推荐

  1. 微信OAuth2.0网页授权接口

    微信OAuth2.0网页授权接口 微信OAuth2.0网页授权接口的thinkphp实现版本号.主要实现了oauth网页受权,以及部分其它接口. 用法 为什么用OAuth2.0受权? 通过OAuth2 ...

  2. 深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手

    文档对象模型Document Object Model DOM(Document Object Model,文档对象模型)是一个通过和JavaScript进行内容交互的API. Javascript和 ...

  3. 将jar文件加到Maven的local repository中

    对于Maven项目来说,日常使用的多数第三方java库文件都可以从Maven的Central Repository中自动下载,但是如果我们需要的jar文件不在Central Repository中,那 ...

  4. jsp页面中日期的格式化

            在一次开发中,由于数据库中生日采用的是datetime的数据类型,因此数据库中数据格式为:2017-07-11 00:00:00. 但是,编辑页面中回显生日肯定是不可以显示出时分秒的, ...

  5. SQL面试整理(1)——数据库连接池

    在web开发中,如果JSP.Servlet或EJB使用JDBC直接访问数据库,每一次数据访问请求都必须经历建立数据库连接,打开数据库,存取数据库和关闭数据库连接等操作步骤,如果频繁发生这种数据库操作, ...

  6. LOJ #2135. 「ZJOI2015」幻想乡战略游戏

    #2135. 「ZJOI2015」幻想乡战略游戏 链接 分析: 动态点分治,求加权重心,带修改. 考虑如果知道了一个点s,如何求答案,那么首先可以点分治的思想,求每个联通块内所有点到分治中心距离和,然 ...

  7. Linux每天一个命令:iperf

    iperf命令 Iperf 是一个网络性能测试工具.Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽.延迟抖动和数据包丢失.下载地址:https: ...

  8. Flutter - 创建底部导航栏

    之前写过的一篇文章介绍了 Flutter - 创建横跨所有页面的侧滑菜单, 这次就一起来学习一下底部导航栏. 底部导航栏在ios平台上非常常见,app store就是这样的风格.还有就是大家最常用的微 ...

  9. 软件测试_测试工具_APP测试工具_对比

    以下是我自己整理的APP测试工具对比,各个工具相关并不全面.尤其关于收费一项,我只是针对自己公司的实际情况进行对比的,每个工具还有其他收费套餐可以选择,详情可进入相关官网进行查看 以下是部分官网链接: ...

  10. springboot 异步调用Async使用方法

    引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...