题目大意:
就是求两点间的最短距离。
解题思路:
不过我们发现顶点数要远远小于边的数目,所以我用dijkstra做的!
#include<stdio.h>
#define N 210
#define inf 1<<31-1
int mp[N][N];
int dis[N];
bool S[N];
void dijkstra(int st,int ed,int n){
int i,j,mmax,k;
for(i=0;i<n;i++)
dis[i]=mp[st][i];
dis[st]=0;S[st]=true;
for(i=0;i<n;i++){
mmax=inf;
for(j=0;j<n;j++){
if(!S[j]&&dis[j]<mmax){
k=j;mmax=dis[j];
}
}
S[k]=true;
if(S[ed]){
i=n+1;
continue;
}
for(j=0;j<n;j++){
if(dis[j]>dis[k]+mp[k][j])
dis[j]=dis[k]+mp[k][j];
}
}
}
void initi(int n){
int i,j;
for(i=0;i<n;i++){
S[i]=false;
dis[i]=inf;
for(j=0;j<n;j++)
mp[i][j]=inf;
}
}
int main()
{
int n,m,i,a,b,d,st,ed;
while(scanf("%d%d",&n,&m)!=EOF){
initi(n);
for(i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&d);
if(d<mp[a][b])
mp[a][b]=mp[b][a]=d;
}
scanf("%d%d",&st,&ed);
dijkstra(st,ed,n);
if(dis[ed]==inf)
puts("-1");
else
printf("%d\n",dis[ed]);
}
return 0;
}