hdu 2544 最短路

#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;
}
         


你可能感兴趣的:(SPFA,dijkstra算法)