c ++程序在main之前崩溃

时间:2016-03-07 21:02:10

标签: c++

当我在下面运行我的代码时,程序崩溃并且编译器消息是Segmentation fault。我在我的代码中搜索了错误,但我找不到任何错误。我的程序似乎甚至没有进入main(),因为我已尝试使用' cout'看看它崩溃的地方,但是我没有输出,即使在主要开始之后立即“完成”。这是代码。有人能告诉我这是什么问题吗?

#include <cmath>
#include <stdio.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

struct edge_t
{

    int a,b,w;
};
bool comp(edge_t a, edge_t b)
{
    if(a.w < b.w)
        return true;
    return false;
}

vector<int> parent;

int find_parent(int x)
{
    if(parent[x] == x)
        return x;
    parent[x] = find_parent(parent[x]);
    return parent[x];
}
void join(int a,int b)
{
    parent[find_parent(a)] = find_parent(b);
    return;
}

int mst(vector<edge_t> v)
{

    sort(v.begin() , v.end() , comp);
    for(int i=0;i<v.size();++i)
        parent[i] = i;
    int sum = 0;
    for(int i=0;i<v.size();++i)
    {
        if(find_parent(v[i].a) != find_parent(v[i].b))
        {
            join(v[i].a, v[i].b);
            sum += v[i].w;
        }
    }

    return sum;
}

int main() {
    cout<<"Hello?\n"; ///does not display anything QQ
    int n,m;
    scanf("%d %d",&n,&m);
    parent.resize(n);
    int p,q,r;
    vector<edge_t> edges;
    int s =0;
    for(int i=0;i<m;++i)
    {
        scanf("%d %d %d",&p,&q,&r);
        edge_t tmp;
        tmp.a = p;
        tmp.b = q;
        tmp.w = r;
        s+=r;
        edges.push_back(tmp);
    }
    printf("%d\n", s - mst(edges));



    return 0;
}

我在hackerrank.com上使用在线ide(我在那里练习问题)。

2 个答案:

答案 0 :(得分:0)

mst功能

for (int i = 0; i<v.size(); ++i)
    parent[i] = i;

这假设parent具有与v相同或更多的元素,如果不是这样,则程序崩溃。

在同一个功能中,您正在拨打find_parent并且尚未验证a&amp; b低于parent.size(),如果您在find_parent函数中选中了if (find_parent(v[i].a) != find_parent(v[i].b)) { join(v[i].a, v[i].b); sum += v[i].w; } ,那就没问题,但是您也没有在那里查看。

find_parent

因此,如果int find_parent(int x) { if (parent[x] == x) return x; } 输入无效,则程序崩溃

z-index

答案 1 :(得分:-1)

根据您的编译环境,如果您启用了系统不支持的指令集(例如AVX),则可能在main之前发生崩溃(我已经在使用VC ++的Windows上看到过这种情况)。尝试编译所有关闭的优化,对于一个古老的&#34;目标架构。

根据您的平台,这也可能是由于找不到共享库,尽管这似乎不太可能。

编辑:删除了关于cout的位,因为你有一个结束行字符和main。这是一个不合时宜的想法。