poj1258(prim)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_26760433/article/details/84641239
今日推荐