#include <iostream>
using namespace std;
#define MAXN 200
#define INF 10000
int dis[ MAXN ][ MAXN ];
int N, M, A, B, X, S, T;
int dij()
{
int *d = new int[ N ];
int *v = new int[ N ];
int mindis, minone;
for(int i = 0; i < N; i ++)
{
d[ i ] = INF;
v[ i ] = 0;
}
d[ S ] = 0;
for(int i = 0; i < N; i ++)
{
mindis = INF;
for(int j = 0; j < N; j ++)
{
if(d[ j ] < mindis && v[ j ] == 0)
{
mindis = d[ j ];
minone = j;
}
}
v[ minone ] = 1;
if(minone == T)
{
break;
}
for(int j = 0; j < N; j ++)
{
if(d[ j ] > (dis[ minone ][ j ] + mindis) && v[ j ] == 0)
{
d[ j ] = dis[ minone ][ j ] + mindis;
}
}
}
delete d;
return ((mindis == INF)?-1:mindis);
}
void init()
{
for(int i = 0; i < MAXN; i ++)
{
for(int j = 0; j < MAXN;j ++)
{
dis[ i ][ j ] = INF;
dis[ j ][ i ] = INF;
if(i == j)
{
dis[ i ][ i ] = 0;
}
}
}
}
int main()
{
while(scanf("%d %d", &N, &M) != EOF)
{
init();
while(M > 0)
{
scanf("%d %d %d", &A, &B, &X);
if(X < dis[ A ][ B ]) //防止重边
{
dis[ A ][ B ] = X;
dis[ B ][ A ] = X;
}
M --;
}
scanf("%d %d", &S, &T);
cout<<dij()<<endl;
}
return 0;
}
杭电ACM1874(最短路径)
最新推荐文章于 2020-12-09 23:56:04 发布