我一直在用c ++实现prim的算法,但是我无法弄清楚为什么我的算法输出错误。
输入格式:第一行具有测试用例数T.对于每个测试用例,在下一行中给出顶点数和边数。对于边数,每行包括3个数字a,b,在顶点a和b之间有权重为w的无向加权边的w。
下面是我的代码:
#include <bits/stdc++.h>
using namespace std;
int spanningTree(int V,int E,vector<vector<int> > graph);
// Driver code
int main()
{
int t;
cin>>t;
while(t--)
{
int V,E;
cin>>V>>E;
vector< vector<int> > graph(V,vector<int>(V,INT_MAX));
while(E--)
{
int u,v,w;
cin>>u>>v>>w;
u--,v--;
graph[u][v] = w;
graph[v][u] = w;
}
cout<<spanningTree(V,E,graph)<<endl;
}
return 0;
}
/*This is a function problem.You only need to complete the function given below*/
// Function to construct and print MST for
// a graph represented using adjacency
// matrix representation, with V vertices.
// graph[i][j] = weight if edge exits else INT_MAX
#include <limits.h>
int *parent;
bool *spt;
int *distance1;
int getMinVertex(int distance1[],bool spt[],int V)
{
int min_weight=INT_MAX,min_vertex=-1;
for(int i=0;i<V;i++)
{
if(!spt[i] && distance1[i]<min_weight)
min_weight=distance1[i],min_vertex=i;
}
cout<<"Min vertex : "<<min_vertex<<endl;
return min_vertex;
}
int spanningTree(int V,int E,vector<vector<int> > graph)
{
// code here
parent=new int[V];
spt=new bool[V];
distance1=new int[V];
for(int i=0;i<V;i++)
parent[i]=-1,spt[i]=false,distance1[i]=INT_MAX;
distance1[0]=0;
parent[0]=-1;
//spt[0]=true;
int current_vertex=getMinVertex(distance1,spt,V);
int mst_weight=0;
while(current_vertex!=-1)
{ cout<<"Visiting : "<<current_vertex<<endl;
for(int i=0;i<V;i++)
{
if(i!=current_vertex) //ignore self-loop
{
int neighbour_weight=graph[current_vertex][i];
if(!spt[i]&&neighbour_weight!=INT_MAX&&distance1[i]>graph[current_vertex][i])
{
distance1[i]=graph[current_vertex][i];
parent[i]=current_vertex;
}
}
}
mst_weight+=distance1[current_vertex];
spt[current_vertex]=true;
current_vertex=getMinVertex(distance1,spt,V);
cout<<"\nDistance array : \n";
for(int i=0;i<V;i++)
cout<<"dist["<<i<<"]:"<<distance1[i]<<" ";
cout<<endl;
cout<<"\nParent Array\n";
for(int i=0;i<V;i++)
cout<<"Parent["<<i<<"]:"<<parent[i]<<" ";
cout<<"\n\n";
} //end of while loop.
delete [] parent;
delete [] spt;
delete [] distance1;
//cout<<mst_weight<<endl;
return mst_weight;
}
数组spt []由已经包含在最小生成树集中的一组顶点组成。distance1[]数组保存距离值。数组parent []用于跟踪正在形成的MST树。
下面是输入的代码输出:
2
3 2
1 2 3 1 3 3
4 3
1 3 5 1 4 6 2 3 7
输出:
Min vertex : 0
Visiting : 0
Min vertex : 2
Distance array :
dist[0]:0 dist[1]:5 dist[2]:1
Parent Array
Parent[0]:-1 Parent[1]:0 Parent[2]:0
Visiting : 2
Min vertex : 1
Distance array :
dist[0]:0 dist[1]:3 dist[2]:1
Parent Array
Parent[0]:-1 Parent[1]:2 Parent[2]:0
Visiting : 1
Min vertex : -1
Distance array :
dist[0]:0 dist[1]:3 dist[2]:1
Parent Array
Parent[0]:-1 Parent[1]:2 Parent[2]:0
4
Min vertex : 0
Visiting : 0
Min vertex : 1
Distance array :
dist[0]:0 dist[1]:5
Parent Array
Parent[0]:-1 Parent[1]:0
Visiting : 1
Min vertex : -1
Distance array :
dist[0]:0 dist[1]:5
Parent Array
Parent[0]:-1 Parent[1]:0
5
我完全无法确定我的代码出了什么问题。请有人帮忙。