首页 > 解决方案 > 谁能告诉我 prim 函数的错误?

问题描述

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

#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";

}

标签: c++11

解决方案


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

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


推荐阅读