题目地址:http://121.249.217.157:8080/contest/view.action?cid=54#problem/C
http://acm.hdu.edu.cn/showproblem.php?pid=1874
源代码:
#include<iostream>
#include<string.h>
using namespace std;
#define INF 100000000
#define MAX 210
int Edge[MAX][MAX];
int dist[MAX];
int s[MAX];
int m,n;
void Dijkstra(int vo)
{
int i,j,k;
memset(s,0,sizeof(s));
for(i=0;i<m;i++)
dist[i]=Edge[vo][i];
s[vo]=1;
dist[vo]=0;
for(i=1;i<m;i++)
{
int min=INF;
int u=vo;
for(j=0;j<m;j++)
{
if(!s[j]&&dist[j]<min)
{
min=dist[j];
u=j;
}
}
s[u]=1;
for(k=0;k<m;k++)
{
if(!s[k]&&Edge[u][k]<INF&&dist[u]+Edge[u][k]<dist[k])
{
dist[k]=dist[u]+Edge[u][k];
}
}
}
}
int main()
{
int edge1,edge2;
int weight;
int stPoint;
int endPoint;
while(cin>>m>>n)
{
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
Edge[i][j]=INF;
for(int i=0;i<n;i++)
{
cin>>edge1>>edge2>>weight;
if(weight<Edge[edge1][edge2])//可能会重复输入边(无向图)
{
Edge[edge1][edge2]=weight;
Edge[edge2][edge1]=weight;
}
}
cin>>stPoint>>endPoint;
for(int i=0;i<m;i++)
Edge[i][i]=0;
Dijkstra(stPoint);
if(dist[endPoint]==INF)
{
cout<<"-1"<<endl;
}
else cout<<dist[endPoint]<<endl; //输出特定点的最短路径值
}
}