• 杭电1874畅通project绪


    畅通project续

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 26362    Accepted Submission(s): 9470


    Problem Description
    某省自从实行了非常多年的畅通project计划后,最终修建了非常多路。只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案要比还有一些方案行走的距离要短非常多。这让行人非常困扰。

    如今,已知起点和终点,请你计算出要从起点到终点,最短须要行走多少距离。

    Input
    本题目包括多组数据,请处理到文件结束。
    每组数据第一行包括两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
    接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
    再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。

    Output
    对于每组数据,请在一行里输出最短须要行走的距离。假设不存在从S到T的路线,就输出-1.

    Sample Input
    3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2

    Sample Output
    2
    -1

    这道题也是非常easy的最短路问题,刚開始错了,是由于没考虑到起点和终点一样,这样就直接输出0,还有是要注意考虑重边。

    代码:

    #include<stdio.h>
    #include<string.h>
    #define INF 1 << 30
    int A , B , X ;

    int S , T ;//代表起点和终点

    int map[201][201] ;

    int dis[201] ;

    int used[201] ;

    //输入函数,而且存图
    void input(int N ,int M)
    {
     A = 0 ;
     B = 0 ;
     X = 0 ;
     S = 0 ;
     T = 0 ;
     for(int i = 0 ; i < 201 ; i++)
     {
      for(int j = 0 ; j < 201 ; j++)
      {
       map[i][j] = INF ;
      }
      dis[i] = INF ;
      used[i] = 0 ;
     }
     for( i = 0 ; i < M ; i++)
     {
      scanf("%d%d%d", &A , &B , &X);
      if(map[A][B] > X)
      {
       map[A][B] = X ;
       map[B][A] = X ;
      }
     }
     scanf("%d%d" , &S , &T );
    }

    //dijstra函数是求最短路
    void dijstra(int N)
    {
     bool r ;
     for(int i = 0 ; i < N ; i++ )
     {
      int min = INF ;
      int c = 0 ;
      r = false ;
      for(int j = 0 ; j < N ; j++)
      {
       if(!used[j] && dis[j] < min)
       {
        min = dis[j] ;
        c = j ;
        r = true ;
       }
      }
      if(!r)
       return ;
      used[c] = 1 ;
      for(j = 0 ; j < N ; j++)
      {
       if(!used[j] && dis[j] > dis[c] + map[c][j])
        dis[j] = dis[c] + map[c][j] ;
      }
     }
    }

    int main()
    {
     int N = 0 , M = 0 ;
     while(~scanf("%d%d" , &N , &M))
     {
            input( N ,M);
      
      dis[S] = 0 ;
      dijstra( N ) ;
      if(S == T)
       printf("0 ");
      else
      {
       if(dis[T] != INF)
        printf("%d ",dis[T]);
       else
        printf("-1 ");
      }
      memset(map,0,sizeof(map)) ;
     }                                                                                                                                                                                                                                                                                                                                 
     return 0 ;
    }

  • 相关阅读:
    日期 根据所选日期 获取 之后N天的日期
    错误退出登录
    挂载路由导航守卫 router
    缓存 ssessionStorage&localStorage
    vue项目 第三方图标库阿里图库
    码云新建仓库 以及本地上传
    sql的四种连接-左外连接、右外连接、内连接、全连接
    C#中常用修饰符
    接口的隐式和显式实现
    C#break、continue、return、goto
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4499848.html
Copyright © 2020-2023  润新知