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";
}
答案 0 :(得分:0)
您不能将long int用作静态数组的索引。您的向量类型为ull,然后将其用作布尔数组访问的索引。
您的选择是动态分配访问数组,或更改向量的数据类型。