⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 好最大边权最小生成树507stree.cpp

📁 设计一个算法
💻 CPP
字号:
#include <iostream>
#include <fstream>
using namespace std;

#include "time.h"
clock_t start,finish;
ifstream in("input.txt");
ofstream out("output.txt");


//定义类型图
void delete2Darray(int ** &x,int rows);
class Agraph
{
    public:
		Agraph(int v=1,int noedge=0);
		~Agraph(){delete2Darray(a,n+1);}
		Agraph &get(int v,int u,int noedge);   //v是顶点数,u是边数
		bool prim(int &result);
		void output();
	private:
		int NoEdge;
		int n;
		int e;
		int **a;
};
void make2Darray(int **&x,int rows,int cols);
Agraph::Agraph(int v,int noedge)
{
	n=v;
	e=0;
	NoEdge=noedge;
	make2Darray(a,n+1,n+1);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]=NoEdge;
}
Agraph &Agraph::get(int v,int u,int noedge) 
{
	int x,y,w;
	n=v;
	e=u;
	NoEdge=noedge;
	make2Darray(a,n+1,n+1);	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]=noedge;
	for(i=0;i<u;i++)
	{
		in>>x>>y>>w;
		a[x][y]=w;
		a[y][x]=w;
	}

	return *this;
}
void Agraph::output()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			cout<<a[i][j]<<" ";
		cout<<endl;
	}
}
void delete2Darray(int ** &x,int rows)
{
	for(int i=0;i<rows;i++)
		delete[]x[i];
	delete []x;
	x=0;
}
void make2Darray(int **&x,int rows,int cols)
{
	x=new int *[rows];
	for(int i=0;i<rows;i++)
		x[i]=new int[cols];
}

//存放边结点
class edgenode
{
	friend void main(void);
	private:
		int weight; //边权
		int u,v;  //与边相关联的2个顶点
};
bool Agraph::prim(int &result)
{
	int i,j,k,kk=0;
	int *lowcost=new int[n+1];
	int *closest=new int[n+1];
	bool *s=new bool[n+1];

	s[1]=true;
	for(i=2;i<=n;i++)
	{
		lowcost[i]=a[1][i];
		closest[i]=1;
		s[i]=false;
	}
	for(i=1;i<n;i++)
	{
		int min=NoEdge;
		j=1;
		for(k=2;k<=n;k++)
			if((lowcost[k]<min)&&(!s[k]))
			{
				min=lowcost[k];
				j=k;
			}
		if(min==NoEdge)return false;
		if(result<lowcost[j])result=lowcost[j];
		s[j]=true;
		kk++;
		for(k=2;k<=n;k++)
			if((a[j][k]<lowcost[k])&&(!s[k]))
			{
				lowcost[k]=a[j][k];
				closest[k]=j;
			}
	}
	return (kk==n-1);
}

void main()
{
	start=clock();
	if(in.fail())
	{
		cout<<"the input.txt is not exist!";
		exit(1);
	}
	int n,m,result=0;      //存最大边权
	bool a;
	in>>n>>m;
	Agraph aa;
	aa.get(n,m,30000);
	a=aa.prim(result);
	if(a==false)out<<"-1";
	else out<<result;
	finish=clock();
	cout<<finish-start;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -