这道题目检查对于dijkstra算法的掌握,如果对于这个算法有疑问的,可以看看这个博客点击打开链接,基本上已经讲得很清楚了。
这道题目的细节有:1:在给的有向图中,一条边会重复,所以我们要选最小的那条覆盖 2:有s-s的边。大家做的时候要小心这两个细节。
dijkstra算法代码整体模板就是这个博客点击打开链接的。
#include<iostream>
#include<string.h>
#define MAX 10000000
using namespace std;
int map[510][510];
int sp[510];
int s[510];
int n,x,y;
void djs(){
for(int i=1;i<=n;i++){
sp[i]=MAX;s[i]=0;
}
int init=x,count=0;
int mv,mi;
for(int i=1;i<=n;i++){
if(map[x][i]<sp[i])sp[i]=map[x][i];
}
while(count++<=n){
mv=MAX+1, mi=-1;
for(int i=1;i<=n;i++){
if(!s[i]){
if(map[init][i]+sp[init]<sp[i])sp[i]=map[init][i]+sp[init];
if(sp[i]<mv){
mv=sp[i];mi=i;
}
}
}
s[mi]=1;init=mi;
}
if(sp[x]==MAX){
cout<<"help!"<<endl;
}
else{
cout<<sp[x]<<endl;
}
}
int main(){
int m;
int a,b,t;
while(cin>>n>>m>>x){
memset(map,1,sizeof(map));
for(int i=0;i<m;i++){
cin>>a>>b>>t;
map[a][b]=min(t,map[a][b]);
}
djs();
}
}