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

📄 main.cpp

📁 Prim算法的实现
💻 CPP
字号:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct E
{
	int a,b;
	int d;
};

int Now;//已经放入结点数
int Use[1001];//是否被使用
int Node[10001];
vector<E> All;//初始边
vector<E> Save;//支撑树中的边
int n;//结点数
int total;//边数


bool Small(E a, E b)
{
	return a.d<=b.d;
}

void Perform()
{
	for(int i=0;i<total;i++)
	{
		if(Use[i]==0)
		{
			if(Node[All[i].a]==1&&Node[All[i].b]==0)
			{
				Node[All[i].b]=1;
				Use[i]=1;
				Now++;
				Save.push_back(All[i]);

				return;
			}//加入离Save中已出现结点相连接的边中权最小的边
			else if(Node[All[i].b]==1&&Node[All[i].a]==0)
			{
				Node[All[i].a]=1;
				Use[i]=1;
				Now++;
				Save.push_back(All[i]);

				return;
			}
		}
			
	}
}

int main()
{
	E temp;

cout<<"请输入结点数"<<endl;

	cin>>n;
	
cout<<"请分别输入构成边的两根结点及边的权,如v23(10)则输入2 3 10 "<<endl;
cout<<"输入0则表示停止输入"<<endl;
	
	int Con;
	while(cin>>Con)
	{
		if(Con==0)
			break;
		else
		cin>>temp.b>>temp.d;
		temp.a=Con;
		All.push_back(temp);
		total++;
		
	}//输入


	sort(All.begin(),All.end(),Small);//比较大小

	/*for(vector<E>::iterator i=All.begin();i!=All.end();i++)
		cout<<(*i).d<<endl;*/

	for(int i=0;i<=n-1;i++)
		Node[i]=0;
	for(int i=0;i<=total-1;i++)
		Use[i]=0;//初始化
	Now=0;

	Save.push_back(All[0]);//放入第一个结点(此处放入的是权最小的边)

	Node[All[0].a]=1;
	Node[All[0].b]=1;
	Use[0]=1;
	Now+=2;

	while(Now<=n-1)//Now=n-1则构成最短支撑树
	{
		Perform();
	}
	
	for(vector<E>::iterator s=Save.begin();s!=Save.end();s++)
		cout<<'v'<<(*s).a<<(*s).b<<"  ";
	cout<<endl;//输出

	return 0;
}

⌨️ 快捷键说明

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