#include<stdio.h>
#include<string.h>
#define inf 10000000
int map[110][110],d[110],used[110];
int n;
void dijikstra(){
int i,j,k,max;
for(i=1;i<=n;i++){
d[i]=map[1][i];
}
d[1]=0;used[1]=1;
for(i=1;i<=n;i++){
max=inf;
for(j=1;j<=n;j++){
if(!used[j]&&max>d[j]){
max=d[j];
k=j;
}
}//选出当前节点与连接点的最小距离
used[k]=1;
for(j=1;j<=n;j++){
if(!used[j]&&d[k]+map[k][j]<d[j]){
d[j]=map[k][j]+d[k];
}//更新节点距离
}
}
}
//dijkstra模板
int main(){
int m,i,j,a,b,val;
while(scanf("%d%d",&n,&m)&&(n||m)){
memset(d,0,sizeof(d));
memset(used,0,sizeof(used));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
map[i][j]=inf;
}//初始化
for(i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&val);
map[a][b]=map[b][a]=val;
}
dijikstra();
printf("%d\n",d[n]);
}
return 0;
}
//spfa算法
#include<stdio.h>
#include<string.h>
#define inf 1000000
int map[110][110],dis[110];
int n,vis[110],queue[1010];//队列的长度要比顶点的个数大一些,不然用C过不了,不知为何?
void SPFA(){
int i,con;
int front=0, reap=1;
for(i=1;i<=n;i++){
dis[i]=inf;
}
queue[front]=1;
dis[1]=0;
vis[1]=1;
while(front<reap){
con=queue[front++];
vis[con]=0;
for(i=1;i<=n;i++){
if(dis[con]+map[con][i]<dis[i]){
dis[i]=dis[con]+map[con][i];
if(!vis[i]){
queue[reap++]=i;
vis[i]=1;
}
}
}
}
}
int main(){
int m,i,j,a,b,val;
while(scanf("%d%d",&n,&m),n||m){
memset(vis,0,sizeof(vis));
memset(queue,0,sizeof(queue));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
map[i][j]=inf;
}
for(i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&val);
if(map[a][b]>val){
map[a][b]=map[b][a]=val;
}
}
SPFA();
printf("%d\n",dis[n]);
}
return 0;
}
hdu 2544 最短路
最新推荐文章于 2020-08-08 21:25:35 发布