杭电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 ;
}

原文地址:https://www.cnblogs.com/lcchuguo/p/4499848.html