zoukankan      html  css  js  c++  java
  • [置顶] 最小生成树Prim算法

    二话不说直接贴代码

    原图传送门:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/minispantree.asp

    但是上面展现的是克鲁斯卡尔算法。我这里是普里姆算法。

    #include <iostream>
    #include <list>
    #include <deque>
    #include <algorithm>
    using namespace std;
    
    typedef struct Line
    {
    	int Dot1;
    	int Dot2;
    	int Power;
    }Line;
    
    static const int arr[] = {0,1,6,
    	0,2,1,
    	0,3,5,
    	1,2,5,
    	1,4,3,
    	2,3,7,
    	2,4,5,
    	2,5,4,
    	3,5,2,
    	4,5,6
    };
    
    
    void BuildMap(list<Line>& vet)
    {
    	/*do
    	{
    	Line temp;
    	cin>>temp.Dot1>>temp.Dot2>>temp.Power;
    	vet.push_back(temp);
    	}while(getchar() != '#');*/
    	for(int i = 0;i < sizeof(arr)/(sizeof(int)*3);++i)
    	{
    		Line temp;
    		temp.Dot1 = arr[i*3];
    		temp.Dot2 = arr[i*3+1];
    		temp.Power = arr[i*3+2];
    		vet.push_back(temp);
    	}
    }
    
    void MST(list<Line>&map,list<Line>& tree)
    {
    	list<Line *> Open;
    	list<int>	OpenId;
    	for(auto p = map.begin();p != map.end();++p)
    	{
    		Open.push_back(&*p);
    		if(find(OpenId.begin(),OpenId.end(),p->Dot1) == OpenId.end())
    			OpenId.push_back(p->Dot1);
    		if(find(OpenId.begin(),OpenId.end(),p->Dot2) == OpenId.end())
    			OpenId.push_back(p->Dot2);
    	}
    	Open.sort([](const Line* a,const Line* b){return a->Power < b->Power;});//支持C++11的编译器
    	tree.push_back(**Open.begin());
    	OpenId.erase(find(OpenId.begin(),OpenId.end(),(*Open.begin())->Dot1));
    	OpenId.erase(find(OpenId.begin(),OpenId.end(),(*Open.begin())->Dot2));
    	Open.pop_front();
    	auto q = Open.begin();
    	while(!OpenId.empty())
    	{
    		if(find(OpenId.begin(),OpenId.end(),(*q)->Dot1) == OpenId.end()
    			&& find(OpenId.begin(),OpenId.end(),(*q)->Dot2) == OpenId.end())
    		{//已加入
    			Open.erase(q);
    			q = Open.begin();
    		}
    		else if(find(OpenId.begin(),OpenId.end(),(*q)->Dot1) == OpenId.end()
    			|| find(OpenId.begin(),OpenId.end(),(*q)->Dot2) == OpenId.end())
    		{//已加入
    			if(find(OpenId.begin(),OpenId.end(),(*q)->Dot1) == OpenId.end())
    				OpenId.erase(find(OpenId.begin(),OpenId.end(),(*q)->Dot2));
    			else if(find(OpenId.begin(),OpenId.end(),(*q)->Dot2) == OpenId.end())
    				OpenId.erase(find(OpenId.begin(),OpenId.end(),(*q)->Dot1));
    			tree.push_back(**q);
    			Open.erase(q);
    			q = Open.begin();
    		}
    		else
    		{
    			++q;
    		}
    	}
    }
    
    
    int main()
    {
    	list<Line> map;
    	list<Line> tree;
    	BuildMap(map);
    	MST(map,tree);
    	return 0;
    }


  • 相关阅读:
    xwalkview 替换掉webview 注意事项
    rsyslog Properties 属性:
    Basic Structure 基本结构:
    Crosswalk 集成到 Android Studio
    awk if 判断
    Important System Configuration 导入系统配置:
    Heap size check 堆大小检查
    Bootstrap Checks 抽样检查:
    Important Elasticsearch configuration 导入Elasticsearch 配置
    while 退出循环
  • 原文地址:https://www.cnblogs.com/pangblog/p/3367624.html
Copyright © 2011-2022 走看看