zoukankan      html  css  js  c++  java
  • 最短路

    最短路

    时间限制: 3 Sec  内存限制: 128 MB
    提交: 76  解决: 34
    [提交][状态][讨论版]

    题目描述

    给定M条边,N个点的带权无向图 
    求1到N的最短路 
    N<=100000 
    M<=500000 

    输入

    第一行:N,M 
    接下来M行3个正整数:ai,bi,ci 表示ai,bi之间有一条长度为ci的路 
    ci<=1000

    输出

    一个整数,表示1到N的最短距离

    样例输入

    4 4
    1 2 1
    2 3 1
    3 4 1
    2 4 1
    

    样例输出

    2
    

    提示

    注意图中可能有重边和自环,数据保证1到N有路径相连

    题解:这道题和题目名字一样,看一下题目就知道是单源最短路,这题spfa比较好,其实dijstra+二叉堆也是可以的。

     1 #include<cstdio> 
     2 #include<algorithm> 
     3 #include<iostream> 
     4 #include<cmath> 
     5 #include<cstring> 
     6 #include<string> 
     7   
     8 using namespace std; 
     9 const int MAXN=100007,MAXM=1000007; 
    10   
    11 int head[MAXN],next[MAXM],v[MAXM],pay[MAXM],dis[MAXN]; 
    12 int p[MAXN]; 
    13 bool boo[MAXN]; 
    14 int n,m,num; 
    15   
    16 void init() 
    17 { 
    18     num=0; 
    19     memset(head,-1,sizeof(head)); 
    20     memset(boo,0,sizeof(boo)); 
    21     for (int i=1;i<=n;i++) 
    22         dis[i]=MAXN*100; 
    23     dis[1]=0;    
    24 } 
    25 inline void add(int u,int arr,int z) 
    26 { 
    27     num++; 
    28     next[num]=head[u]; 
    29     head[u]=num; 
    30     v[num]=arr; 
    31     pay[num]=z; 
    32 } 
    33 void solve() 
    34 { 
    35     int top=0,tail=1; 
    36     p[tail]=1,boo[1]=1; 
    37       
    38     while (top!=tail) 
    39     { 
    40         top=top%n+1; 
    41         int u=p[top],arr; 
    42         for (int i=head[u];i!=-1;i=next[i]) 
    43         { 
    44             arr=v[i]; 
    45             if (dis[u]+pay[i]<dis[arr]) 
    46             { 
    47                 dis[arr]=dis[u]+pay[i]; 
    48                 if (boo[arr]==0) 
    49                 { 
    50                     tail=tail%n+1; 
    51                     p[tail]=arr; 
    52                     boo[arr]=1; 
    53                 } 
    54             } 
    55         } 
    56         boo[u]=0; 
    57     } 
    58       
    59 } 
    60 int main() 
    61 { 
    62     scanf("%d%d",&n,&m); 
    63       
    64     init(); 
    65       
    66     int x,y,z; 
    67     for (int i=1;i<=m;i++) 
    68     { 
    69         scanf("%d%d%d",&x,&y,&z); 
    70         add(x,y,z); 
    71         add(y,x,z); 
    72     } 
    73       
    74     solve(); 
    75       
    76     printf("%d",dis[n]); 
    77 } 
    View Code
  • 相关阅读:
    张维迎:你必须知道的10个经济学原理
    艾德莱斯绸:“千年时尚”托起新产业
    Sending forms through JavaScript[form提交 form data]
    Sending form data
    Your first HTML form
    form submission
    <input type="file">
    web storm查看文件结构
    jQuery-File-Upload
    IHttpHandler
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/6953466.html
Copyright © 2011-2022 走看看