hdu 1874 畅通工程续

http://acm.hdu.edu.cn/showproblem.php?pid=1874

  这是一道基础的最短路的题,回顾了dijkstra算法,但是看题的时候有点不仔细,

没注意到题目说的a, b之间可能有多条路,所以初始化出了点小问题,导致WA。

#include<cstdio>
#include<cstring>
#include<cstdlib>

const int MAXN = 205;
const int INF = 0x3f3f3f3f;
int d[MAXN], w[MAXN][MAXN];
bool vis[MAXN];
int n, M, a, b, x, S, T;

int min( int a, int b)
{
return a < b ? a : b;
}

void init()
{
for( int i = 0; i < n; i ++)
for( int j = 0; j < n; j ++)
{
if( i != j)
w[i][j] = INF;
else w[i][j] = 0;
}

while( M --)
{
scanf( "%d%d%d", &a, &b, &x);
if( x < w[a][b])
w[a][b] = w[b][a] = x;
}
scanf( "%d%d", &S, &T);
for( int i = 0; i < n; i ++)
d[i] = ( i == S ? 0 : INF);
memset( vis, false ,sizeof vis);
}

void dijkstra()
{
for( int i = 0; i < n; i ++)
{
int u, m = INF;
for( int v = 0; v < n; v ++)
if( !vis[v] && d[v] < m){
m = d[v];
u = v;
}
vis[u] = true;
for( int v = 0; v < n; v ++)
if(!vis[v])
d[v] = min( d[u] + w[u][v], d[v]);
}
}

int main()
{
while( scanf( "%d%d", &n, &M) == 2)
{
init();
dijkstra();
if( d[T] == INF) printf( "-1\n");
else printf( "%d\n", d[T]);
}
return 0;
}

 

你可能感兴趣的:(HDU)