回 帖 发 新 帖 刷新版面

主题:[原创]偶写的最短路径 呵呵

#include<stdio.h>
#define INFINITY 1000000
#define MAX 100
#define ElemType long
typedef struct {
    long weight[MAX][MAX];
    int vexnum;
}MGraph;
int final[MAX]={0};
void Path(MGraph G,int v0,long d[]){
    long i,v,w,min;
    for(v=0;v<G.vexnum;v++){
        final[v]=0;
        d[v]=G.weight[v0][v];
    }
    d[v0]=0;
    final[v0]=1;
    for(i=1;i<G.vexnum;i++){
        min=INFINITY;
        for(w=0;w<G.vexnum;w++)
            if(!final[w])
                if(d[w]<min){min=d[w];v=w;}
                final[v]=1;
        for(w=0;w<G.vexnum;w++)
            if(!final[w]&&min+G.weight[v][w]<d[w])
                d[w]=min+G.weight[v][w];
    }
}
void Init(long d[],int n){
    int i;
    for(i=0;i<n;i++)
        d[i]=0;
}
int main(){
    MGraph G;
    long i,j,k,d[MAX];
    int n;    
    while(scanf("%d",&n)!=EOF){
    G.vexnum=n;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++){
            scanf("%ld",&G.weight[i][j]);
        if(G.weight[i][j]==0) G.weight[i][j]=INFINITY;
        }
    for(i=0;i<n;i++){
        Init(d,n);
        Path(G,i,d);
        for(j=0;j<n;j++){
            if(d[j]>=INFINITY) printf("0");
            else printf("%ld",d[j]);
        if(j!=n-1) printf(" ");
        }
        printf("\n");
    }
    }
    return 0;
}

回复列表 (共2个回复)

沙发

更新的版本
#include<stdio.h>
#define INFINITY 10000
#define MAX 10
typedef struct{
    int weight[MAX][MAX];
    int vexnum;
}MGraph;
int final[MAX]={0};
void Path(MGraph G,int v0,int d[]){
    int min,i,v,w;
    for(v=0;v<G.vexnum;v++){
        final[v]=0;
        d[v]=G.weight[v0][v];
    }
    d[v0]=0;final[v0]=1;
    for(i=1;i<G.vexnum;i++){
        min=INFINITY;
        for(w=0;w<G.vexnum;w++)
            if(!final[w])
                if(d[w]<min){
                    min=d[w];
                    v=w;
                }
        for(w=0;w<G.vexnum;w++)
            if(!final[w]&&(min+G.weight[v][w]<d[w]))
                d[w]=min+G.weight[v][w];
    }
}
int main(){
    int i,j,n,d[MAX];
    MGraph G;
    printf("Input the vexnum\n");
    while(scanf("%d",&n)){
        G.vexnum=n;
        for(i=0;i<G.vexnum;i++)
            for(j=0;j<G.vexnum;j++){
                scanf("%d",&G.weight[i][j]);
                if(G.weight[i][j]==0) G.weight[i][j]=INFINITY;
            }
        for(i=0;i<G.vexnum;i++){
            Path(G,i,d);
            for(j=0;j<G.vexnum;j++)
                if(d[j]>=INFINITY) printf("0 ");
                else printf("%d ",d[j]);
            printf("\n");
        }
    }
    return 0;
}

板凳

测试数据请详见:
http://acm.xmu.edu.cn/JudgeOnline/showproblem?problem_id=1060

我来回复

您尚未登录,请登录后再回复。点此登录或注册