zoukankan      html  css  js  c++  java
  • COJ 0579 4020求次短路的长度

    4020求次短路的长度
    难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
    试题描述

    在一个地图上共有N个路口(编号分别为1到N),R条道路(道路均可以双向通行)。问1号路口到N号路口的次短路长度是多少?次短路指的是比最短路长度长的次短的路径。同一条边可以经过多次。

    输入
    第一行包括两个整数N、R,接下来的R行,每行三个数x,y和m,表示第x号路口到第y号路口的距离是m。
    输出
    一个数,表示次短路的长度。
    输入示例
    4 4
    1 2 100
    2 4 200
    3 4 100
    2 3 250
    输出示例
    450
    其他说明
    数据范围:1<=N<=5000,1<=R<=100000,0<m<10000.

    题解:

    方法1:窝萌可以用A*跑k短路对吧?

    方法2:注意到是次短路,就枚举绕的边更新答案就行。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=5000+10,maxm=200000+10,inf=1e8;
    11 struct ted{int x,y,w;ted*nxt;}adj[maxn<<1],*fch[maxn],*ms=adj;
    12 void add(int x,int y,int w){
    13     *ms=(ted){x,y,w,fch[x]};fch[x]=ms++;*ms=(ted){y,x,w,fch[y]};fch[y]=ms++;return;
    14 }
    15 int n,m;queue<int>Q;
    16 struct solver{
    17     bool inq[maxn];int d[maxn];
    18     void spfa(int S){
    19         for(int i=1;i<=n;i++)d[i]=inf,inq[i]=false;d[S]=0;queue<int>Q;Q.push(S);
    20         while(!Q.empty()){
    21             int u=Q.front();Q.pop();inq[u]=false;
    22             for(ted*e=fch[u];e;e=e->nxt){
    23                 int v=e->y;
    24                 if(d[v]>d[u]+e->w){
    25                     d[v]=d[u]+e->w;
    26                     if(!inq[v])Q.push(v),inq[v]=true;
    27                 }
    28             }
    29         }return;
    30     }
    31 }p1,p2;
    32 inline int read(){
    33     int x=0,sig=1;char ch=getchar();
    34     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
    35     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
    36     return sig?x:-x;
    37 }
    38 inline void write(int x){
    39     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    40     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    41     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    42 }
    43 int ans=inf,midist;
    44 void init(){
    45     n=read();m=read();int x,y,w;
    46     for(int i=1;i<=m;i++){
    47         x=read();y=read();w=read();add(x,y,w);
    48     }
    49     p1.spfa(1);p2.spfa(n);midist=p1.d[n];//write(midist);ENT;
    50     return;
    51 }
    52 void work(){
    53     int size=ms-adj-1;
    54     for(int i=0;i<=size;i+=2){
    55         int u=adj[i].x,v=adj[i].y,w=adj[i].w;
    56         int d1=p1.d[u]+w+p2.d[v],d2=p2.d[u]+w+p1.d[v];
    57         if(d1!=midist)ans=min(ans,d1);
    58         if(d2!=midist)ans=min(ans,d2);
    59     }
    60     return;
    61 }
    62 void print(){
    63     write(ans);
    64     return;
    65 }
    66 int main(){init();work();print();return 0;}
  • 相关阅读:
    day04作业
    一个简单的gridlayout栗子
    用户名、密码等15个常用的js正则表达式
    html 颜色
    心态好的人,一辈子都好
    怎么样好好的聊天呢
    一篇引用文章
    再见,发微信不回的人
    第一个不怎么正经的网页
    关于学科目标
  • 原文地址:https://www.cnblogs.com/chxer/p/4669342.html
Copyright © 2011-2022 走看看