图结构练习——最小生成树
来源:互联网 发布:小额贷款那个软件最好 编辑:程序博客网 时间:2024/06/05 10:47
题目描述
输入
输出
示例输入
3 21 2 11 3 11 0
示例输出
20
提示
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define INF 0x3f3f3f3f
using namespace std;
int arr[110][110];//记录顶点之间的弧关系;
int dis[110];//用来记录当前生成树到每个节点的距离(权值);
bool vis[110];//标记数组
int prim(int n)//生成最小树,求最小权值;
{
memset(vis,false,sizeof(vis));//标记数组清零
for(int i=1;i<=n;i++)
dis[i]=arr[1][i];;//从1号节点开始生成树
int ans=0;//距离权值总和
vis[1]=true;//生成树的根(起点)标记访问过
for(int i=2;i<=n;i++)//要生成n-1条边,所以循环n-1次
{
int pos=i;//用来记录每一次循环找到的结点编号
int min=INF;;//标记为无穷大
for(int j=1;j<=n;j++)//对dis数组进行遍历找到距离最小的
if(vis[j]==false&&dis[j]<min)
{
min=dis[j];//更新最小距离
pos=j;//记录节点编号
}
ans+=min;//加上找到的最小权值
vis[pos]=true;//标记找到的该点被访问
for(int j=1;j<=n;j++)//更新dis数组
if(vis[j]==false&&dis[j]>arr[pos][j])//路径通过中间路径pos使路径更小。
dis[j]=arr[pos][j];//更新生成树到该点的距离
}
return ans;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)//边的初始化;
{
if(i==j)
arr[i][j]=0;
else
arr[i][j]=INF;//无穷大;
}
for(int i=1,v1,v2,w;i<=m;i++)
{
scanf("%d%d%d",&v1,&v2,&w);
if(arr[v1][v2]>w||arr[v2][v1]>w)//选取权值最小的边;
arr[v1][v2]=arr[v2][v1]=w;
}
printf("%d\n",prim(n));
}
}
- SDUT 2144 图结构练习——最小生成树
- sdut2144图结构练习——最小生成树
- 图结构练习——最小生成树
- 图结构练习——最小生成树
- 图结构练习——最小生成树
- 图结构练习——最小生成树
- 图结构练习——最小生成树
- 图结构练习——最小生成树
- 图结构练习——最小生成树 kruskal
- 图结构练习——最小生成树-prim
- 图结构练习——最小生成树
- 图结构练习——最小生成树
- 图结构练习——最小生成树
- 图结构练习——最小生成树
- 图结构练习——最小生成树 Prim算法
- 图结构练习——最小生成树 Kruskal算法
- 图结构练习——最小生成树
- 图结构练习——最小生成树
- 【NOIP 模拟题】[山东多校联合模拟赛 day1 T3] Formula 1 (BFS+并查集)
- ubuntu 安装搜狗输入法(解决部分ubuntu安装完没有键盘选择栏)
- memcached 小记
- web.xml中的contextConfigLocation在spring中的作用
- Counting Bits
- 图结构练习——最小生成树
- 判断android中列表是否在顶部
- 移动端js触摸事件
- 把云之讯音视频Demo从Eclipse转到AndroidStudio上
- OC语法基础:使用storyboard和xib的区别
- aapt
- 自定义事件
- 二叉树中和为某一值的路径
- 基础篇--StringBuffer、StringBuilder、String