• 洛谷—— P2149 [SDOI2009]Elaxia的路线


    https://www.luogu.org/problem/show?pid=2149

    题目描述

    最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。 现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。

    输入输出格式

    输入格式:

    第一行:两个整数N和M(含义如题目描述)。 第二行:四个整数x1、y1、x2、y2(1 ≤ x1 ≤ N,1 ≤ y1 ≤ N,1 ≤ x2 ≤ N,1 ≤ ≤ N),分别表示Elaxia的宿舍和实验室及w**的宿舍和实验室的标号(两对点分别 x1,y1和x2,y2)。 接下来M行:每行三个整数,u、v、l(1 ≤ u ≤ N,1 ≤ v ≤ N,1 ≤ l ≤ 10000),表 u和v之间有一条路,经过这条路所需要的时间为l。

    输出格式:

    一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)

    输入输出样例

    输入样例#1:
    9 10
    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
    输出样例#1:
    3

    说明

    对于30%的数据,N ≤ 100;

    对于60%的数据,N ≤ 1000;

    对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。

    以给定的4个点跑4遍最短路,

    确定每条同时在在于两点间最短路上的边,更新ans

      1 #include <cstdlib>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <queue>
      5 
      6 #define max(a,b) (a>b?a:b)
      7 #define min(a,b) (a<b?a:b)
      8 inline void read(int &x)
      9 {
     10     x=0; register char ch=getchar();
     11     for(; ch>'9'||ch<'0'; ) ch=getchar();
     12     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
     13 }
     14 const int INF(0x3f3f3f3f);
     15 const int N(1500+5);
     16 const int M(2e6+15);
     17 int n,m,s1,s2,t1,t2;
     18 int head[N],sumedge,hed[N],sum;
     19 struct Edge {
     20     int v,next,w;
     21     Edge(int v=0,int next=0,int w=0):v(v),next(next),w(w){}
     22 }edge[M<<1],e[M];
     23 struct Road {
     24     int u,v,w;
     25     Road(int u=0,int v=0,int w=0):u(u),v(v),w(w){}
     26 }road[M];
     27 inline void ins(int u,int v,int w)
     28 {
     29     edge[++sumedge]=Edge(v,head[u],w);
     30     head[u]=sumedge;
     31     edge[++sumedge]=Edge(u,head[v],w);
     32     head[v]=sumedge;
     33 }
     34 
     35 bool vis[N];
     36 int dis[N][5];
     37 struct Node {
     38     int pos,dis;
     39     Node() { pos=0; dis=0; }
     40     bool operator < (const Node &x)const
     41     {
     42         return dis>x.dis;
     43     }
     44 }u,v;
     45 inline void Dijkstra(int s,int op)
     46 {
     47     memset(vis,0,sizeof(vis));
     48     std::priority_queue<Node>que;
     49     for(int i=1; i<=n; ++i)    dis[i][op]=INF;
     50     u.pos=s; u.dis=dis[s][op]=0; que.push(u);
     51     for(; !que.empty(); )
     52     {
     53         u=que.top(); que.pop();
     54         if(vis[u.pos]) continue;    vis[u.pos]=1;
     55         for(int i=head[u.pos]; i; i=edge[i].next)
     56         {
     57             v.pos=edge[i].v;
     58             if(dis[v.pos][op]>dis[u.pos][op]+edge[i].w)
     59             {
     60                 v.dis=dis[v.pos][op]=dis[u.pos][op]+edge[i].w;
     61                 que.push(v);
     62             }
     63         }
     64     }
     65 }
     66 
     67 int rd[N],val[N],ans;
     68 inline void add(int u,int v,int w)
     69 {
     70     e[++sum]=Edge(v,hed[u],w);
     71     hed[u]=sum; rd[v]++;
     72 }
     73 inline int Top_sort()
     74 {
     75     int ret=0;
     76     std::queue<int>que;
     77     for(int i=1; i<=n; ++i)
     78         if(!rd[i]) que.push(i);
     79     for(int u,v; !que.empty(); )
     80     {
     81         u=que.front(); que.pop();
     82         for(int i=hed[u]; i; i=e[i].next)
     83         {
     84             v=e[i].v;
     85             if(val[v]<val[u]+e[i].w)
     86                 val[v]=val[u]+e[i].w,ret=max(ret,val[v]);
     87             if(--rd[v]==0) que.push(v);
     88         }
     89     }
     90     return ret;
     91 }
     92 
     93 inline bool check(int x)
     94 {
     95     return (dis[x][1]+dis[x][3]==dis[t1][1])&&(dis[x][2]+dis[x][4]==dis[t2][2]);
     96 }
     97 
     98 int Presist()
     99 {
    100     read(n),read(m),read(s1);
    101     read(t1),read(s2),read(t2);
    102     for(int u,v,w,i=1; i<=m; ++i)
    103         read(u),read(v),read(w),
    104         ins(u,v,w),road[i]=Road(u,v,w);
    105     Dijkstra(s1,1); Dijkstra(s2,2);
    106     Dijkstra(t1,3); Dijkstra(t2,4);
    107     for(int i=1; i<=n; ++i) if(check(i))
    108         for(int j=i+1; j<=n; ++j) if(check(j))
    109            ans=max(ans,std::abs(dis[i][1]-dis[j][1]));
    110     printf("%d
    ",ans);
    111     return 0;
    112 }
    113 
    114 int Aptal=Presist();
    115 int main(int argc,char*argv[]){;}
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    ligerui做分页显示数据
    js判断input为空校验
    js操作table倒叙显示序号的问题
    js获取div中的文本框数据
    js数组到后台转 list数组
    table 操作
    js操作table
    父页面调用子页面的方法
    laravel修改密码及与原密码Hash::check比较 阿星小栈
    php获取中文字符拼音首字母 阿星小栈
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7597620.html
Copyright © 2020-2023  润新知