题目描述
给一个n(1<=n<=2500)个点m(1<=m<=6200)条边的无向图,求s到t的最短路。
输入
第一行四个由空格隔开的整数n,m,s,t 之后的m行,每行三个正整数a、b、c,表示一条从a到b长度为c的边。
输出
一个整数表示从s到t的最短路长度。数据保证至少存在一条道路。
输入样例
7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1
输出样例
7
代码
#include<stdio.h>
#define MAX 100000000
int map[2505][2505];
int n,m,s,t;
int visited[2505]={0},dis[2505]={0};
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
int i,j;
int x,y;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=MAX;
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
scanf("%d",&map[x][y]);
map[y][x]=map[x][y];
}
for(i=1;i<=n;i++)
{
visited[i]=0;
dis[i]=map[s][i];
}
visited[s]=1;
dis[s]=0;
dijsktra();
printf("%d",dis[t]);
return 0;
}
void dijsktra()
{
int i,j;
for(i=1;i<=n;i++)
{
int min=MAX,min_point;
for(j=1;j<=n;j++)
if(visited[j]==0&&dis[j]<min)
min_point=j,min=dis[j];
visited[min_point]=1;
for(j=1;j<=n;j++)
if(visited[j]==0&&dis[j]>dis[min_point]+map[min_point][j])
dis[j]=dis[min_point]+map[min_point][j];
}
}