最小生成树
来源:互联网 发布:山西八建集团网络平台 编辑:程序博客网 时间:2024/06/06 20:24
prime模板
{
if(lowcost[j] != 0 && lowcost[j] > dis[choose] [j] )
lowcost[j] = dis[choose][j];
}
program:
#include <iostream>
#include <memory>
#include <cmath>
using namespace std;
int const MAX = 110;
int dis[MAX][MAX];
int lowcost[MAX];
int main()
{
int n;
int i,j;
while(cin >> n)
{
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
cin >> dis[i][j];
//下面是prim算法部分,ans是计算所有路径的和
lowcost[0] = 0;
for(i = 1; i < n; i++)
lowcost[i] = dis[0][i];
int ans = 0;
for(i = 1; i < n; i++)
{
double min = (1<<30);
int choose;
for(j = 1; j < n; j++)
{
if(lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
choose = j;
}
}
ans += lowcost[choose];
lowcost[choose] = 0;
for(j = 1; j < n; j++)
{
if(lowcost[j] != 0 && lowcost[j] > dis[choose][j])
lowcost[j] = dis[choose][j];
}
}
cout << ans << endl;
}
return 0;
}
kruskal模板
#include <iostream>
#include <memory>
#include <algorithm>
using namespace std;
const int MAX = 1010; //节点个数
const int MAXEDGE = 15010; //边个数
bool used[MAXEDGE]; //标记边是否用过
struct node
{
int begin, end, dis;
}data[MAXEDGE];
class UFSet
{
private:
int parent[MAX+1];
int size;
public:
UFSet(int s = MAX);
int Find(int x);
void Union(int root1, int root2);
};
UFSet::UFSet(int s)
{
size = s+1;
memset(parent, -1, sizeof(int)*size);
}
void UFSet::Union(int root1, int root2)
{
int temp = parent[root1] + parent[root2];
if(parent[root1] <= parent[root2])
{
parent[root2] = root1;
parent[root1] = temp;
}
else
{
parent[root1] = root2;
parent[root2] = temp;
}
}
int UFSet::Find(int x)
{
int p = x;
while(parent[p] > 0)
p = parent[p];
int t = x;
while(t != p)
{
t = parent[x];
parent[x] = p;
x = t;
}
return p;
}
bool cmp(node a, node b)
{
return (a.dis < b.dis);
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int i,j;
for(i = 0; i < m; i++)
scanf("%d%d%d", &data[i].begin, &data[i].end, &data[i].dis);
//最小生成树
UFSet ufs(n);
sort(data, data+m, cmp);
int root1, root2;
int total = 0;
for(i = 0; i < m; i++)
{
root1 = ufs.Find(data[i].begin);
root2 = ufs.Find(data[i].end);
if(root1 == root2) continue;
ufs.Union(root1, root2);
used[i] = true;
total++;
if(total == n-1) break;
}
printf("%d\n%d\n", data[i].dis, n-1);
for(j = 0; j <= i; j++)
if(used[j])
printf("%d %d\n", data[j].begin, data[j].end);
return 0;
}
- 最小比例 最小生成树
- 最小生成树&&次最小生成树
- 最小生成生成树计数
- 树+最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树Kruskal
- kruskal 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树问题
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- SQL语句删除表格
- 大数的阶乘(C语言实现)
- java反射详解------java平台框架基础必备
- S3C6410 MFC H264 编码
- Tuxedo历史
- 最小生成树
- Android NDK环境搭建
- 9、编程实现两个正整数的除法
- PHP精确统计字符个数
- FFMpeg框架代码阅读
- Xcode 中IOS项目文件类型及其作用
- POJ 1106 Transmitters(离散化)
- hibernate---->lazy
- bat 截取字符串