您的位置:首页 > 其它

水题 kruskal算法求最小生成树

2016-05-14 21:40 295 查看
时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB

描述

要求对一个图使用kruskal算法求最小生成树,依次输出选出的边所关联的顶点序列,要求下标较小者在前,如图所示,其顶点序列为1 3 4 6 2 5 3 6 2 3


输入若干行整数

第一行为两个整数,分别为图的顶点数和边数

第二行开始是该图的邻接矩阵,主对角线统一用0表示,无直接路径的两点用100来表示(保证各边权值小于100)
输出若干用空格隔开的整数
样例输入
6 10
0 6 1 5 100 100
6 0 5 100 3 100
1 5 0 5 6 4
5 100 5 0 100 2
100 3 6 100 0 6
100 100 4 2 6 0


样例输出

1 3 4 6 2 5 3 6 2 3

#include "iostream"
#include "deque"
#include "algorithm"
using namespace std;
#define Max 100

int Father[Max];

int Find(int x)  //查
{
if(x==Father[x]) return x;
else  return Find(Father[x]);
}
void Union(int x,int y)  //并
{
Father[x]=y ;
}

int Top,Edge;
struct Node
{
int Next;
int Weight;
int Priority;
};
bool Com(Node x,Node y)
{

return x.Weight<y.Weight;

}

deque<Node>Map;

int main()
{

//cin>>Top>>Edge && Top!=0

//freopen("1.txt","r",stdin);
cin>>Top>>Edge;
int i,j;
Node y;
for(i=1;i<=Top;i++)
for(j=1;j<=Top;j++)
{
int x;
cin>>x;
if(j>i && x!=100)
{
y.Next=j;
y.Priority=i;
y.Weight=x;
Map.push_back(y);
}
}
sort(Map.begin(),Map.end(),Com);

for(i=1;i<=Top;i++)
{
Father[i]=i;
}

int count=0;
for(i=0;i<Map.size();i++)
{
if(count==Top-1) break;

if(Find(Map[i].Priority)!=Find(Map[i].Next))
{
Union(Map[i].Priority,Map[i].Next);
count++;
if(Map[i].Priority>Map[i].Next)
cout<<Map[i].Next<<" "<<Map[i].Priority<<" ";
else
cout<<Map[i].Priority<<" "<<Map[i].Next<<" ";

}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: