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的路线的更多相关文章

  1. 洛谷P2149 Elaxia的路线

    传送门啦 分析: 我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记.两边之后找两次都标记的边有多少就行了. 但...我并没有实现出来. 最后让我们看 ...

  2. 洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告

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

  3. 洛谷——P2149 [SDOI2009]Elaxia的路线

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

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

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

  5. BZOJ-1880 Elaxia的路线 SPFA+枚举

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 921 Solved: 354 [Submit][Sta ...

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

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

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

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

  8. 【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)

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

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

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

随机推荐

  1. tomcat6.0 配置不同端口访问不同项目

    <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF ...

  2. window.load 和$(document).ready() 、window.load和body onload区别

    1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕.2.编写个数不同 w ...

  3. static 成员函数

    和静态数据成员一样,静态成员函数是所有对象共享的,不是单独属于某一个对象,由于静态成员函数没有传递this指针,故static member function 只能访问static成员,不能访问非st ...

  4. java中配置自定义拦截器中exclude-mapping path是什么意思?

    <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/>//过滤全部请求 & ...

  5. sqlserver中怎么查询字段为空的记录

    sqlserver中怎么查询字段为空的记录的两种方法: 详细介绍请查看全文:https://cnblogs.com/qianzf/ 原文博客的链接地址:https://cnblogs.com/qzf/

  6. 2018.08.11 洛谷P3224 [HNOI2012]永无乡(线段树合并)

    传送门 给出n个带点权的点,支持连边和查询连通块第k大. 这个貌似就是一道线段树合并的裸板啊... 代码: #include<bits/stdc++.h> #define N 100005 ...

  7. TabHost实现通话记录界面

    //MainActivity.java   public class MainActivity extends TabActivity   {       @Override       public ...

  8. sql左外连接、右外连接、group by、distinct(区别)、intersect(交叉)、通配符、having

    连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条件所选的行.             连接可分为以下几类 ...

  9. if_elseif

    用MATLAB写了个这样的程序 if ((0 < pwr <=2) ) wf_temp1 = round(temp_wf0/2^7); elseif( (2 < pwr<= 4 ...

  10. D3 API总览

    D3图形库API参考 https://github.com/d3/d3/wiki/API--%E4%B8%AD%E6%96%87%E6%89%8B%E5%86%8C d3 官网 API https:/ ...