求单源最短路,没有负边,用Dijkstra。
题目:http://poj.org/problem?id=2387
此题要注意最大INF的初始化问题,如果使用0x7f7f7f7f来初始化,很容易越界,造成WA。所以用0x3f3f3f3f比较妥当。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <math.h>
#include <algorithm>
using namespace std;
int map[1002][1002];
int dist[1002];
int visited[1002];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int t,n;
int a,b,c;
scanf(" %d %d",&t,&n);
memset(map,0x3f,sizeof(map));
for(int i=0; i<t; i++)
{
scanf(" %d %d %d",&a,&b,&c);
map[a][b] = map[b][a] = min(map[a][b],c);
}
for(int i=1; i<=n; i++)
{
map[i][i] = 0;
}
memset(dist,0x3f,sizeof(dist));
memset(visited,0,sizeof(visited));
dist[n] = 0;
for(int i=1; i<=n; i++)
{
int min = 0x3f3f3f3f;
int k = 0;
for(int j=1; j<=n; j++)
{
if(visited[j] == 0 && dist[j]<min)
{
min = dist[j];
k = j;
}
}
visited[k] = 1;
for(int j=1; j<=n; j++)
{
if(dist[j] > dist[k] + map[k][j])
{
dist[j] = dist[k] + map[k][j];
}
}
}
printf("%d\n",dist[1]);
return 0;
}