這是來自Kattis的編程挑戰之一,我已經解決了它,所以我想看看別人如何解決它。所以,我碰到這一塊的代碼,但我無法理解這兩個具體線路:for循環之後的if語句是什麼意思?
for(i=0;i<N;i++) if(inTree[i])
和
for(j=0;i<N;j++) if(inTree[j])
我不明白如何將這些if語句在此算法的工作。是否應該檢查兩個節點之間是否存在鏈接?代碼如下:
#include <stdio.h>
#include <math.h>
#define MAX 105
int N,T;
float x[MAX], y[MAX];
int inTree[MAX];
int main()
{
int c,i,j;
float dx,dy;
int minp;
float len,min,weigth;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
for(i=0;i<N;i++)
inTree[i]=0;
for(i=0;i<N;i++)
{
scanf("%f %f",&x[i],&y[i]);
/*printf("%d (%f, %f)\n",i+1,x[i],y[i]);*/
}
/* Prim's Algorithm */
c=1;
inTree[0]=1;
weigth=0;
while(c<N)
{
min = -1.0;
for(i=0;i<N;i++) if(inTree[i])
for(j=0;j<N;j++) if(!inTree[j])
{
dx=x[i]-x[j]; dy=y[i]-y[j];
len=sqrt(dx*dx+dy*dy);
if(min == -1.0 || len < min)
{
min=len;
minp=j;
}
}
inTree[minp]=1;
weigth+=min;
c++;
}
printf("%.2f\n",weigth);
if(T>0)
printf("\n");
}
return 0;
}
在循環的每次迭代中執行'if'。比較[this](http://coliru.stacked-crooked.com/a/3acf302359f1215a)。 –
請注意,這種混淆是很多原因之一,爲什麼通常不鼓勵在控制結構中省略大括號,而在同一行上組合多個控制結構。這些事情往往會影響可讀性,如果代碼和結果增加了bug的機會。 – Christopher