http://acm.hdu.edu.cn/showproblem.php?pid=1874
题目标题:畅通工程续
题目大意:给出一个图与起点和终点,求两个点之间权值最小的路径
一个很基础的求最短路径的题,我用的Dijkstra算法来做的最短路径,Dijkstra算法类似于Prim算法,都是利用一个辅助数组来存关键点的最短距离,这个题有一个陷阱就是两个城市之间可能有好几条路(坑死人)
#include<iostream>
#include<stdio.h>
#include<string.h>
#define Debug 0
using namespace std;
int a[205][205];
int d[205];
bool Judge[205];
int m,n;
int Shortest(int start,int end){
for(int i=0;i<n;i++){
d[i]=a[start][i];
}
d[start]=0;
Judge[start]=0;
for(int i=1;i<n;i++)
{
int sign;
int min=1000001;
for(int j=0;j<n;j++){
if(!Judge[j]){
if(d[j]<min){
sign=j;
min=d[j];
}
}
}
Judge[sign]=1;
for(int j=0;j<n;j++){
if(!Judge[j] && (min+a[sign][j])<d[j]){
d[j]=min+a[sign][j];
}
}
}
if(Debug){
for(int i=0;i<n;i++){
cout<<d[i]<<' ';
}
cout<<endl;
}
if(d[end]>1000000) d[end]=-1;
return d[end];
}
int main()
{
while(cin>>n>>m){
memset(a,1000001,sizeof(int)*205*205);
memset(Judge,0,sizeof(bool)*205);
for(int i=0;i<m;i++){
int x,y,z;
cin>>x>>y>>z;
if(z<a[x][y]){
a[x][y]=z;
a[y][x]=z;
}
}
if(Debug){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
int s,e;
cin>>s>>e;
cout<<Shortest(s,e)<<endl;
}
return 0;
}