有人可以告诉我prim函数的错误吗?

时间:2019-07-19 14:47:22

标签: c++11

prim函数有问题。 我猜是分段错误。 请帮我解决一下这个。我已经尝试了很多。 s是实际上无关紧要的起始顶点。 arr是存储权重的2D数组。 V是存储相邻边的2D数组。 检查数组存储最小距离。 访问商店访问过的节点。

#define INF 99999;
typedef long int ull;
bool visit[3000]={false};
vector<ull>check(3000,0);

void prim(ull in,vector<ull>V[],ull **arr)
{
ull i;
visit[in]=true;


for(i=0;i<V[in].size();i++)
{
    if(!visit[V[in][i]])
    {
        check[V[in][i]]=min(check[V[in][i]],arr[in][V[in][i]]);
    }

}
check[in]=INF;
}

void solve()
{
ull i,j,n,e,s,u,v,w;
cin>>n>>e;
vector<ull>V[n];
ull **arr=new ull*[n];
for(i=0;i<n;i++)
{
    arr[i]=new ull[n];
}
for(i=0;i<n;i++)
{
    check[i]=INF;
}

for(i=0;i<e;i++)
{
    cin>>u>>v>>w;
    u--;
    v--;
    arr[u][v]=w;
    arr[v][u]=w;
    V[u].push_back(v);
    V[v].push_back(u);
}
cin>>s;
s--;
ull ind,ad=0;
check[s]=0;

for(i=0;i<n;i++)
{
   auto it=min_element(check.begin(),check.end());
   ad+=check[it-check.begin()];


   ind=(it-check.begin());

  prim(ind,V,arr);

}

cout<<ad<<"\n";

}

1 个答案:

答案 0 :(得分:0)

您不能将long int用作静态数组的索引。您的向量类型为ull,然后将其用作布尔数组访问的索引。

您的选择是动态分配访问数组,或更改向量的数据类型。