越界问题,一个问题出现了Runtime Error (ACCESS_VIOLATION)

C++语言 码拜 8年前 (2016-05-09) 1004次浏览
不值得哪儿越界了,求高手看看

/*
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

根据你的输入跑了下发现能得到结果越界问题,一个问题出现了Runtime Error (ACCESS_VIOLATION)

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明越界问题,一个问题出现了Runtime Error (ACCESS_VIOLATION)
喜欢 (0)
[1034331897@qq.com]
分享 (0)