P2149 Elaxia的路线
P2149 Elaxia的路线
题意简述: 在一个n(n<=1500)个点的无向图里找两对点之间的最短路径的最长重合部分,即在保证最短路的情况下两条路径的最长重合长度(最短路不为一)
- 思路:
- 两边dij,第一遍最短路,第二遍在保证最短路的情况下让重合路径长度最长的先出队
- 代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std; #define res register int
inline int read()
{
int x=0,f=1; char ch;
while(!isdigit(ch=getchar()))if(ch=='-')f=-1;
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
} const int N=1500+10,M=N*N*2;
int x1,y1,x2,y2,n,m,tot=1; struct node{
int x,y;//xΪ×î¶Ì·³¤¶È£¬yΪ×î³¤ÖØºÏ·¾¶³¤¶È
bool operator >(const node &n2) const{return x==n2.x?y<n2.y:x>n2.x;}
bool operator <(const node &n2) const{return x==n2.x?y>n2.y:x<n2.x;}//СÓÚ ->¸üÓÅ
node(int _x=0,int _y=0) : x(_x),y(_y){}
bool operator ==(const node &n2) const{return x==n2.x&&y==n2.y;}
node operator +(const node &n2) const{return node(x+n2.x,y+n2.y);}
}edge[M],dis[M];
int ver[M],nxt[M],head[N],vis[N]; inline void add(int x,int y,int z)
{
ver[++tot]=y; nxt[tot]=head[x]; head[x]=tot; edge[tot]=node(z,0);
} struct point{
int p; node d;
bool operator <(const point &n2) const{return d>n2.d;}
point(int _p=0,node _d=node(0,0)) : p(_p),d(_d) {}
}; inline void dij(int s)
{
priority_queue <point> q;
for(res i=1 ; i<=n ; ++i) dis[i]=node(0x3f3f3f3f,0),vis[i]=0;
dis[s]=node(0,0); q.push(point(s,dis[s]));
while(q.size())
{
point now=q.top(); q.pop();
int x=now.p;
if(vis[x]) continue; vis[x]=1;
for(res i=head[x] ; i ; i=nxt[i])
{
int y=ver[i];
if(dis[y]>dis[x]+edge[i])
{
dis[y]=dis[x]+edge[i];
q.push(point(y,dis[y]));
}
}
}
} void dfs(int x)
{
for(res i=head[x] ; i ; i=nxt[i])
{
int y=ver[i];
if(dis[y]+edge[i]==dis[x])
{
edge[i].y+=edge[i].x; edge[i^1].y+=edge[i].x;
dfs(y);
}
}
} int main()
{
n=read(); m=read();
x1=read(); y1=read(); x2=read(); y2=read();
for(res i=1 ; i<=m ; ++i)
{
int x=read(),y=read(),z=read(); add(x,y,z); add(y,x,z);
}
dij(x1); dfs(y1); dij(x2);
printf("%d\n",dis[y2].y);
return 0;
}
P2149 Elaxia的路线的更多相关文章
- 洛谷P2149 Elaxia的路线
传送门啦 分析: 我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记.两边之后找两次都标记的边有多少就行了. 但...我并没有实现出来. 最后让我们看 ...
- 洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告
P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia ...
- 洛谷——P2149 [SDOI2009]Elaxia的路线
P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每 ...
- Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)
P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...
- BZOJ-1880 Elaxia的路线 SPFA+枚举
1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 921 Solved: 354 [Submit][Sta ...
- BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )
找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 ---- ...
- 【BZOJ1880】[Sdoi2009]Elaxia的路线(最短路)
[BZOJ1880][Sdoi2009]Elaxia的路线(最短路) 题面 BZOJ 洛谷 题解 假装我们知道了任意两点间的最短路,那么我们怎么求解答案呢? 不难发现公共路径一定是一段连续的路径(如果 ...
- 【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 ...
随机推荐
- 2018.09.01 loj#2330. 「清华集训 2017」榕树之心(树形dp)
传送门 树形dp好题啊. 我们用w[i]" role="presentation" style="position: relative;">w[ ...
- 2018.08.15 bzoj3747: [POI2015]Kinoman(线段树)
传送门 简单题. 先不管时间复杂度看看怎么做. 对于一段区间[l,r],如果从右端加入一个数a[r+1],对这个区间有什么影响?显然如果区间中已经有了a[r+1]这个数就会产生-a[i+1]的影响,否 ...
- 一文读懂:超详细正态分布方差等于o的推导
(uv)' = [(u+△u)(v+△v) - uv] /△x = (v△u+u△v +△u△v)/△x = v(△u/△x) + u(△v/△x) +(△u△v)/△x =u'v+uv'
- 重大发现 springmvc Controller 高级接收参数用法
1. 数组接收 @RequestMapping(value="deleteRole.json") @ResponseBody public Object deleteRole(S ...
- redis只加载AOF文件
如果同时配置写AOF和RDB两种文件,但在redis启动时,只会加载AOF,除非配置只写RDB,才会加载RDB文件,也因此AOF文件必须是全量数据,所以会越来越大,这缺点也将是redis优化的一个方向 ...
- 整数重复的第n位计算公式
513不停的重复形成513513513....,求第n位是几的计算公式.
- jupyterlab notebook区别
https://juejin.im/entry/5b350e52f265da59bd5ed31e Windows 7(Windows 10)安装后anaconda 命令行jupyter lab 出现4 ...
- hdu 1877
题目 一个进制转换的题,注意0+0的情况 代码如下: #include <cstdio> int d[1000]; void solve(int n,int base) { int p = ...
- shell 脚本 抽取指定数量的随机学生
#!/bin/bash # #!/bin/bash # read -p '输入数' c #指定抽取的学生人数 jw=('王浩' '谢云生' '黄科杨' '何星宇' '张宸兵' '邓培林' '刘桃' ' ...
- RandomForest in Spark MLLib
决策树类模型 ml中的classification和regression主要基于以下几类: classification:决策树及其相关的集成算法,Logistics回归,多层感知模型: regres ...