1001
来源:互联网 发布:中小型网络设计方案 编辑:程序博客网 时间:2024/06/11 01:29
题意:求村庄联通需要几条路
思路:就是老师上课讲的求最小生成树的算法,有两个,一个prim,一个kruskal。
感想:在acm与运筹学,离散数学,高等数学结合以后,又一次抱上了数据结构的大腿。
#include<iostream>
#include<algorithm>using namespace std;
struct node{
int from;
int to;
int w;
};
node edge[102*100];
int parent[102];
bool cmp(node a,node b)
{
if(a.w<=b.w) return true;
return false;
}
//查找已经建完道路的顶点
int find(int a)
{
if(a!=parent[a])
return find(parent[a]);
else return a;
}
int kruskal(int n,int m)
{
sort(edge,edge+m,cmp);//将边的权值从小到大排序
int i,x,y,ans=0;
for(i=0;i<m;i++)
{
x=edge[i].from;
y=edge[i].to;
x=find(x);
y=find(y);
if(x!=y)
{
ans+=edge[i].w;
parent[y]=x;
}
}
return ans;
}
int main()
{
int n,q,k,i,j,m;
while(cin>>n)
{
m=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>k;
if(i>=j) continue;//标记过的不用重复记录
edge[m].from=i;
edge[m].to=j;
edge[m].w=k;
m++;
}
}
for(k=1;k<=n;k++)
parent[k]=k;
cin>>q;
//将建完的道路的起点和终点都置为相同的起点
for(k=1;k<=q;k++)
{
cin>>i>>j;
i=find(i);
j=find(j);
parent[j]=i;
}
//n个点,m条边
cout<<kruskal(n,m)<<endl;
}
return 0;
}
0 0
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 1001
- 程序员的自我修养
- 遗传算法
- JavaScript数组去重
- Java使用freemark生成word
- win10 下php安装redis扩展
- 1001
- Android入门--android.graphics.Typeface实践
- 路径中 斜杠/和反斜杠\ 的区别
- C++编程规范及标准
- SAP MM采购信息记录作用与浅析
- python实现发送email
- mysql 基础操作
- 使用ajax中success后的返回值
- 数据库优化资料