最近研究了这东西 感觉十分有用 在对于少边的情况下效果十分明显
本程序使用优先队列存储边信息 使用并查集判定是否已经连通 O(eloge)的复杂度
#include <iostream>
#include <queue>
using namespace std;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
const long MAXN=10000;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
long hash[MAXN];
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
long m,n;//点数 边数
//m标号从1开始
typedef struct
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
long from;
long to;
long cost;
}Edge;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
bool operator <(const Edge &a, const Edge &b)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
return a.cost>b.cost;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
priority_queue<Edge> q;
Edge e;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void MakeSet()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
long i;
for (i=0;i<=m;++i)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
hash[i]=i;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
long Find(long i)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
long r=i;
while (hash[r]!=r)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
r=hash[r];
}
while (hash[i]!=r)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
long j=hash[i];
hash[i]=r;
i=j;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return r;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void Unition(long x,long y)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
long fx=Find(x);
long fy=Find(y);
if (fx!=fy)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
hash[fx]=fy;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void Init()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
while (!q.empty())
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
q.pop();
}
MakeSet();
long i;
for(i=0;i<n;++i)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
scanf("%ld %ld %ld",&(e.from),&(e.to),&(e.cost));//得到源点 终点
q.push(e);
//以下为无向图的处理
swap(e.from,e.to);
q.push(e);
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void print(long cost)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
printf("%ld\n",cost);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void Kruskal()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
Init();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
long t=0;//表示合并次数
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
long cost=0;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Edge e;
while (!q.empty()&&t<m-1)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
e=q.top();
long v1=e.from;
long v2=e.to;
if (Find(v1)!=Find(v2))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Unition(v1,v2);
cost+=e.cost;
++t;
}
q.pop();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
print(cost);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
int main()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
while(scanf("%ld %ld",&m,&n)!=EOF)//输入点与边
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Kruskal();
}
return 0;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)