二维数组传参数要申明列数:因为数组寻址 i + j * y,i、j分别是行列数。
水题直接贴代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 110;
const int inf = 0x7f7f7f7f;
int dis[maxn][maxn];
int dis_set[maxn];
int v_num, e_num;
int ans;
void prim()
{
int n = 0; //加入集合的点
while(n <= v_num)
{
int min_x = 0;//最小点下标 距离
int min_d = inf;
for (int i = 0; i < v_num; i++)
{
if (dis_set[i] == 0) continue;
if(dis_set[i] < min_d)
{
min_d = dis_set[i];
min_x = i;
}
}
dis_set[min_x] = 0;
if(min_d < inf)
ans += min_d;
for (int i = 0; i < v_num; i ++)
dis_set[i] = min(dis_set[i], dis[i][min_x]);
n++;
}
}
void init_dis(int arr[][maxn])
{
for (int i = 0 ; i < v_num; i++)
for(int j = 0; j < v_num; j++)
{
if(i == j) arr[i][j] = 0;
else arr[i][j] = inf;
}
}
void init_dis_set(int arr[])
{
for (int i = 0; i < v_num; i ++)
arr[i] = inf;
}
int main()
{
while(scanf("%d", &v_num))
{
if(v_num == 0) break;
scanf("%d", &e_num);
init_dis(dis);
init_dis_set(dis_set);
for(int i = 0; i < e_num; i ++)
{
int x, y, k;
scanf("%d %d %d", &x, &y, &k);
x--, y--;
if(k < dis[x][y])
{
dis[x][y] = k;
dis[y][x] = k;
}
}
ans = 0;
prim();
printf("%d\n",ans);
}
return 0;
}