プリム法について勉強について勉強しているのですが入力が100×100隣接行列の時に結果が少しだけ異なってしまいます。
問題としては最小全域木で与えられた重み付きグラフに対する最小全域木の辺の重みの総和を計算するプログラムを作成すると言うものです。
Prims関数に関して何かおかしなところがあれば教えていただきたいです。
問題はこちらです。
問題
うまくいかない入力例はこちらです。
入力例
本来なら出力結果が
3864
となるはずなのですが
3991
となってしまいます。
c
1#include<stdio.h> 2#define max 1000 3#define inf 100000 4 5int vertex_num,admat[max][max]; 6 7int Prims(){ 8 int i,j,u,v,cost[max][max],min_distance; 9 int visit[max],no_edges,min_cost,distance[max],from[max]; 10 11 for(i=0;i<vertex_num;i++){ 12 for(j=0;j<vertex_num;j++){ 13 if(admat[i][j]==0){ 14 cost[i][j]=inf; 15 }else{ 16 cost[i][j]=admat[i][j]; 17 } 18 } 19 } 20 distance[0]=0; 21 visit[0]=1; 22 23 for(i=1;i<vertex_num;i++){ 24 distance[i]=cost[0][i]; 25 from[i]=0; 26 visit[i]=0; 27 } 28 min_cost=0; 29 no_edges=vertex_num-1; 30 31 while(no_edges>0){ 32 min_distance=inf; 33 for(i=1;i<vertex_num;i++){ 34 if(visit[i]==0 && distance[i]<min_distance){ 35 v=i; 36 min_distance=distance[i]; 37 } 38 } 39 u=from[v]; 40 no_edges--; 41 visit[v]=1; 42 for(i=1;i<vertex_num;i++){ 43 if(visit[i]==0 && cost[i][v]<distance[i]){ 44 distance[i]=cost[i][v]; 45 from[i]=v; 46 } 47 } 48 min_cost+=cost[u][v]; 49 } 50 51 return min_cost; 52} 53 54int main(){ 55 //admatは隣接行列 56 int i,j; 57 58 scanf("%d",&vertex_num); 59 for(i=0;i<vertex_num;i++){ 60 for(j=0;j<vertex_num;j++){ 61 scanf("%d",&admat[i][j]); 62 } 63 } 64 for(i=0;i<vertex_num;i++){ 65 for(j=0;j<vertex_num;j++){ 66 if(admat[i][j]==-1){ 67 admat[i][j]=0; 68 } 69 //printf("%d ",admat[i][j]); 70 } 71 } 72 73 printf("%d\n",Prims()); 74 return 0; 75} 76

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/27 06:20
2019/01/27 06:34
2019/01/27 13:21