题意:求任意两个点之间的最短路径。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
const int INF = 1e5;
int road[220][1100];
bool vis[220];
int cost[220];
int n,m;
void dij(int x)
{
memset(vis, false,sizeof vis);
for(int i=0; i<n; i++)
cost[i] = road[x][i];
cost[x] = 0;
vis[x] = 1;
for(int i=0; i<n; i++)
{
int temp = INF, k;
for(int j=0; j<n; j++)
{
if(!vis[j] && temp > cost[j])
{
temp = cost[j];
k = j;
}
}
vis[k] = true;
if(temp == INF) break;
for(int l=0; l<n; l++)
{
if(!vis[l])
{
cost[l] = min(cost[l],cost[k] + road[k][l]);
}
}
}
}
int main()
{
while(cin >> n >> m)
{
int a, b, c;
for(int i=0; i<n; i++)
fill(road[i], road[i]+n, INF);
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c);
if(road[a][b] > c)
road[a][b] = road[b][a] = c;
}
int start,end1;
cin >>start >> end1;
dij(start);
if(cost[end1] == INF)
cout << "-1" << endl;
else
cout << cost[end1] << endl;
}
return 0;
}