畅通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\n"); else { if(dis[T] != INF) printf("%d\n",dis[T]); else printf("-1\n"); } memset(map,0,sizeof(map)) ; } return 0 ; }