zoukankan      html  css  js  c++  java
  • BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)

    题目描述

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

    Elaxia和w**每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。

    现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。

    输入输出格式

    输入格式:

    第一行:两个整数N和M(含义如题目描述)。

    第二行:四个整数x1、y1、x2、y2(1 ≤ x1 ≤ N,1 ≤ y1 ≤ N,1 ≤ x2 ≤ N,1 ≤ y2 ≤ 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,输入数据保证没有重边和自环。

    题解

      不会,抄题解的

      就这里->这个

     1 //minamoto
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<queue>
     7 #define inf 0x3f3f3f3f
     8 using namespace std;
     9 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
    10 char buf[1<<21],*p1=buf,*p2=buf;
    11 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
    12 inline int read(){
    13     #define num ch-'0'
    14     char ch;bool flag=0;int res;
    15     while(!isdigit(ch=getc()))
    16     (ch=='-')&&(flag=true);
    17     for(res=num;isdigit(ch=getc());res=res*10+num);
    18     (flag)&&(res=-res);
    19     #undef num
    20     return res;
    21 }
    22 const int N=1505,M=2500005;
    23 int n,m,X1,Y1,X2,Y2;
    24 int ver[M],Next[M],head[N],edge[M],from[M],tot;
    25 int ver0[M],Next0[M],head0[N],edge0[M],from0[M],tot0,im[M];
    26 int dis[6][N],sol[N],cnt[N];bool vis[N];
    27 queue<int> q;
    28 inline void add(int u,int v,int e){
    29     ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e,from[tot]=u;
    30 }
    31 inline void add0(int u,int v,int e,bool x){
    32     ver0[++tot0]=v,Next0[tot0]=head0[u],head0[u]=tot0,edge0[tot0]=e,im[tot0]=x;
    33 }
    34 void spfa(int s,int I){
    35     memset(dis[I],0x3f,sizeof(dis[I]));
    36     q.push(s),dis[I][s]=0;
    37     while(!q.empty()){
    38         int u=q.front();q.pop();vis[u]=0;
    39         for(int i=head[u];i;i=Next[i]){
    40             int v=ver[i];
    41             if(dis[I][v]>dis[I][u]+edge[i]){
    42                 dis[I][v]=dis[I][u]+edge[i];
    43                 if(!vis[v]) vis[v]=1,q.push(v);
    44             }
    45         }
    46     }
    47 }
    48 void init(){
    49     for(int i=1;i<=tot;++i){
    50         int u=from[i],v=ver[i];
    51         if(dis[1][u]+edge[i]+dis[2][v]==dis[1][Y1]){
    52             if(dis[3][u]+edge[i]+dis[4][v]==dis[3][Y2]
    53             ||dis[4][u]+edge[i]+dis[3][v]==dis[3][Y2])
    54             add0(u,v,edge[i],1);
    55             else add0(u,v,edge[i],0);
    56             ++cnt[v];
    57         }
    58     }
    59 }
    60 void solve(){
    61     q.push(X1);
    62     while(!q.empty()){
    63         int u=q.front();q.pop();
    64         for(int i=head0[u];i;i=Next0[i]){
    65             int v=ver0[i];
    66             if(!(--cnt[v])) q.push(v);
    67             cmax(sol[v],sol[u]+edge0[i]*im[i]);
    68         }
    69     }
    70 }
    71 int main(){
    72     n=read(),m=read();
    73     X1=read(),Y1=read(),X2=read(),Y2=read();
    74     for(int i=1;i<=m;++i){
    75         int u=read(),v=read(),e=read();
    76         add(u,v,e),add(v,u,e);
    77     }
    78     spfa(X1,1),spfa(Y1,2),spfa(X2,3),spfa(Y2,4);
    79     init(),solve();
    80     printf("%d
    ",sol[Y1]);
    81     return 0;
    82 }
  • 相关阅读:
    Pycharm(一)下载安装
    Django(一)创建和启动项目
    windows10自动登陆
    Tushare安装
    笑话
    python异常处理
    XPath与Xquery
    XML相关概念
    JDK、JRE、JVM三者间的关系
    CMS
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9513150.html
Copyright © 2011-2022 走看看