【题解】 [SDOI2009] Elaxia的路线(最短路+拓扑排序)
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的路线(最短路+拓扑排序)的更多相关文章
- 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)
[SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...
- BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)
Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...
- Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序
Solution 另外$ m <=5e5$. 两条最短路的 最长公共路径 一定是若干条连续的边, 并且满足拓扑序. 于是我们分别 正向 和反向走第二条路径,若该条边同时是两条最短路径上的边, 则 ...
- bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】
有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
[BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...
- BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )
找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 ---- ...
- Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)
P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)
[BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...
- BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2049 Solved: 805 题目链接:https ...
- bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1944 Solved: 759[Submit][St ...
随机推荐
- 页签中加按钮 odoo里面
<notebook> <page string="订"> <field name="line_id" > <tree ...
- 1.6《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——小结
本章节学过的重要命令整理,见下表Table 2. 命令 描述 例子 echo <string> 向屏幕输出字符串 $ echo hello man <command> 显示命令 ...
- sql语句之随机查询记录和批量插入--基于mysql
本周遇到了好几次数据库方面的问题,一个是上一篇文章提到的因为要修改数据结构引起的在表间复制字段的需求,另一个就是这篇文章要写的:1,从某个数据表中按照某个字段不重复的随机选取几百条记录:2,然后把这些 ...
- GBDT源码剖析
如今,GBDT被广泛运用于互联网行业,他的原理与优点这里就不细说了,网上google一大把.但是,我自认为自己不是一个理论牛人,对GBDT的理论理解之后也做不到从理论举一反三得到更深入的结果.但是学习 ...
- fastjson 使用记录
参考: https://www.cnblogs.com/cdf-opensource-007/p/7106018.html import com.alibaba.fastjson.JSON; impo ...
- [CF1007D]Ants[2-SAT+树剖+线段树优化建图]
题意 我们用路径 \((u, v)\) 表示一棵树上从结点 \(u\) 到结点 \(v\) 的最短路径. 给定一棵由 \(n\) 个结点构成的树.你需要用 \(m\) 种不同的颜色为这棵树的树边染色, ...
- 记录下安装ES过程中遇到的错误及解决
1.集群配置 需要修改 cluster.name .node.name .network.host: 0.0.0.0[此处默认localhost].http.port: 9200 只要集群名相同,且机 ...
- 使用Python实时获取cmd的输出
最近发现一个问题,一个小伙儿写的console程序不够健壮,监听SOCKET的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须 ...
- More Effective C++ Item14:明智运用exception specifications
使用exception specifications你必须非常仔细去确保,函数调用的子函数.注册的回调函数不会违背约定.而设计模板内部的异常更难确保. 设计回调机制的时候,如果调用方规定了不抛出异常, ...
- Android中级教程之----Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一睹为快,希望对大家入门Android Log有一定的帮助. android. ...