实现Prim的算法-逻辑错误

时间:2019-10-31 16:07:03

标签: algorithm minimum-spanning-tree

我一直在用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

我完全无法确定我的代码出了什么问题。请有人帮忙。

0 个答案:

没有答案