版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26760433/article/details/84641239
这题会prim算法没啥难度的(prim算法也没啥难的),注意有多组测试数据。
我用了priority_queue,寻找最优边。
贴代码
//Memory 352k Time 63ms
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
class road
{
public:
int end; //终点
int weight; //长度
};
class Graph
{
public:
int v;
vector<road> *adj;
int *mark;
Graph(int n);
~Graph();
void addEdge(int b,int e,int w);
};
Graph::Graph(int n)
{
v=n;
adj=new vector<road>[n];
mark = new int[n];
for(int i=0;i<n;i++)
mark[i]=0; //标记为未访问
}
Graph::~Graph()
{
delete [] adj;
delete [] mark;
}
void Graph::addEdge(int b,int e,int w)
{
road r,r2;
r.end = e;
r.weight = w;
adj[b].push_back(r);
}
class Dist
{
public:
int index;
int pre;
int length;
friend bool operator<(const Dist & a,const Dist &b)
{
return a.length>b.length;
}
};
int MST(Graph & g,int s)
{
int ans=0;
Dist *D=new Dist[g.v];
for(int i=0;i<g.v;i++)
{
D[i].index = i;
D[i].length=1<<30;
D[i].pre = s;
}
priority_queue<Dist> aqueue;
int v=s;
g.mark[v]=1;
for(int i=0;i<g.v-1;i++)
{
vector<road>::iterator ii = g.adj[v].begin();
for(; ii !=g.adj[v].end();ii++)
{
if( g.mark[ii->end]==0 && D[ii->end].length> ii->weight )
{
D[ii->end].length = ii->weight;
D[ii->end].pre = v;
aqueue.push(D[ii->end]);
}
}
Dist d;
while(!aqueue.empty())
{
d=aqueue.top();
aqueue.pop();
if(g.mark[d.index]==0)
break;
}
g.mark[d.index]=1;
ans = ans + d.length;
v=d.index;
}
return ans;
}
int main()
{
int N;
int w;
while(cin>>N)
{
Graph g(N);
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cin>>w;
if(i==j)
continue;
g.addEdge(i,j,w);
}
}
cout<<MST(g,0)<<endl;
}
return 0;
}