不值得哪儿越界了,求高手看看
/* 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
根据你的输入跑了下发现能得到结果