[Sdoi2009]Elaxia的路线
Description
Input
Output
Sample Input
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
HINT
对于30%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。
分别以x1,y1,x2,y2为起点,做4次SPFA
分别算出dist[1~4][x]
那么我们可以找到他们各自最短路中相同的边
只要同时满足:
dist[1][u]+w(u,v)+dist[2][v]=dist[1][y1]
dist[3][u]+w(u,v)+dist[4][v]=dist[3][y2]
那么就说明,这条边同时处于两人的最短路上
然后将这些边建一个新图,可以保证无环
最后拓扑排序求出最长的链
但是,这道题隐藏了一个情况:
从y2~x2的w**与从x1~y1的Elaxia在边上相遇,也就是相向而行走一条边,也算共同走了这一条
也就是说,我们要将w**起点终点反转,重新建边和拓扑
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
struct Node
{
int next,to,dis;
}edge[],edge2[];
int head[],num,head2[],num2,dist[][],f[],n,d[],ans,m;
int s1,s2,t1,t2;
bool vis[];
void add(int u,int v,int w)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
edge[num].dis=w;
}
void add_Top(int u,int v,int w)
{
num2++;
edge2[num2].next=head2[u];
head2[u]=num2;
edge2[num2].to=v;
edge2[num2].dis=w;
}
void SPFA(int S,int T,int p)
{int i;
queue<int>Q;
memset(dist[p],/,sizeof(dist[p]));
dist[p][S]=;
Q.push(S);
while (Q.empty()==)
{
int u=Q.front();
Q.pop();
vis[u]=;
for (i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if (dist[p][v]>dist[p][u]+edge[i].dis)
{
dist[p][v]=dist[p][u]+edge[i].dis;
if (vis[v]==)
{vis[v]=;
Q.push(v);
}
}
}
}
}
void Top_sort()
{int i;
queue<int>Q;
memset(f,,sizeof(f));
for (i=;i<=n;i++)
if (d[i]==) Q.push(i),f[i]=;
while (Q.empty()==)
{
int u=Q.front();
Q.pop();
ans=max(ans,f[u]);
for (i=head2[u];i;i=edge2[i].next)
{
int v=edge2[i].to;
d[v]--;
f[v]=max(f[v],f[u]+edge2[i].dis);
if (d[v]==)
{
Q.push(v);
}
}
}
}
int main()
{int i,u,v,w,j;
cin>>n>>m;
cin>>s1>>t1>>s2>>t2;
for (i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
SPFA(s1,t1,);
SPFA(t1,s1,);
SPFA(s2,t2,);
SPFA(t2,s2,);
for (i=;i<=n;i++)
{
for (j=head[i];j;j=edge[j].next)
{
int v=edge[j].to;
if (dist[][i]+edge[j].dis+dist[][v]!=dist[][t1]) continue;
if (dist[][i]+edge[j].dis+dist[][v]!=dist[][t2]) continue;
add_Top(i,v,edge[j].dis);
d[v]++;
}
}
Top_sort();
SPFA(t2,s2,);
SPFA(s2,t2,);
memset(d,,sizeof(d));
memset(head2,,sizeof(head2));
for (i=;i<=n;i++)
{
for (j=head[i];j;j=edge[j].next)
{
int v=edge[j].to;
if (dist[][i]+edge[j].dis+dist[][v]!=dist[][t1]) continue;
if (dist[][i]+edge[j].dis+dist[][v]!=dist[][s2]) continue;
add_Top(i,v,edge[j].dis);
d[v]++;
}
}
Top_sort();
cout<<ans;
}
[Sdoi2009]Elaxia的路线的更多相关文章
- BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )
找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 ---- ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)
[BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...
- 洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告
P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia ...
- 【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)
1880: [Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. ...
- BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2049 Solved: 805 题目链接:https ...
- 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)
[SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
[BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...
- 洛谷——P2149 [SDOI2009]Elaxia的路线
P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每 ...
- bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1944 Solved: 759[Submit][St ...
- Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)
P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...
随机推荐
- C语言博客作业--函数 陈张鑫
一.PTA实验作业 题目1:6-3 使用函数判断完全平方数 1. 本题PTA提交列表 2. 设计思路 1.定义int IsSquare( int n )函数 2.判断(sqrt(n)是否为整数 3., ...
- Hibernate学习错误集锦-GenericJDBCException: could not execute statement
初次使用Hibernate,进行junit测试,报如下错误. 原因:Hibernate帮我们管理主键了,我们不需要对主键赋值,并且主键是自增的.所以在数据库中,逐渐选项应当勾选 org.hiberna ...
- JAVA线程概念
一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在 ...
- Struts2之配置文件中Action的详细配置(续)
承接上一篇 4.处理结果的配置 Action类的实例对象调用某个方法,处理完用户请求之后,将返回一个逻辑视图名的字符串.核心Filter收到返回的逻辑视图名字符串,根据struts.xml中的逻辑视图 ...
- 《高级软件测试》JIRA使用手册(一)JIRA基本情况
JIRA 官方网站为:https://www.atlassian.com/software/jira 中文代理网站为:https://www.jira.cn 现版本:v7.3.0 Atlassian公 ...
- 【译】Gradle 的依赖关系处理不当,可能导致你编译异常
文章 | Ashesh Bharadwaj 翻译 | 承香墨影 授权 承香墨影 翻译.编辑并发布 在 Android Studio 中,Gradle 构建过程对于开发者来说,很大程度上是抽象的.作为一 ...
- HTML标签小记文本类标签
文本类标签: <input type="text" name="" value="">文本框 type(方式,方法)name文 ...
- 从PRISM开始学WPF(五)MVVM(一)ViewModel?
从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? ...
- Linux入门(2)_给初学者的建议
1 学习Linux的注意事项 严格区分大小写(命令, 文件, 选项) Linux中所有内容以文件形式保存, 包括硬件 硬盘文件是/dev/sd[a-p] 光盘文件是/dev/sr0等 Linux不靠扩 ...
- ESP8266 wifi 模块配置,Wechat+APP控制实现
首先刷入安信可的AiCloud 2.0 SDK文件,AiCloud 2.0具体信息参见AiCloud 1.0 和AiCloud 2.0对比 APP见如下二维码下载. 1.安信可AiCloud 2.0 ...