不值得哪儿越界了,求高手看看
/*
HDU 1102 Constructing Roads
题意:有n个乡村,修路,然后保证每两条路之间连接。
假如A和B连接,那么A和B直接连接或中间还有一个乡村,间接连接。
已经有一些路了,你的任务是找出来一路径连接全部乡村。
输入:i到j的长度,注意去重边
最小生成树,,,
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10005;
struct edge
{
int u,v,w;
}e[N];
int n,f[N];
//将边降序排序
bool cmp(edge a,edge b)
{
return a.w<=b.w;
}
void Init()
{
for(int i = 1;i <= n;i++)
f[i] = i;
}
int getf(int u)
{
if(f[u] == u)
return u;
else
{
f[u] = getf(f[u]);
return f[u];
}
}
void merge(int u,int v)
{
int t1 = getf(u);
int t2 = getf(v);
if(t1 != t2)
{
f[t2] = t1;
}
}
int Kruskal(int m)
{
int ans=0;
sort(e,e+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(getf(e[i].u)!=getf(e[i].v))//未连通
{
merge(e[i].u,e[i].v);
ans+=e[i].w;
}
}
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
memset(e,0,sizeof(e));
int x,num = 1;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
{
scanf("%d",&x);
if(i >= j)
continue;
e[num].u = i;
e[num].v = j;
e[num].w = x;
num++;
}
Init();//并查集优化
int q,t1,t2;
scanf("%d",&q);
for(int i = 0;i < q;i++)
{
scanf("%d%d",&t1,&t2);
merge(t1,t2);//合并已有的道路
}
printf("%d\n",Kruskal(num-1));
}
return 0;
}
/*
3
0 990 692
990 0 179
692 179 0
1
1 2
*/
解决方案
20
调试代码。这问错误一般都是由数组越界,野指针,空指针造成的
40
根据你的输入跑了下发现能得到结果
