Agri-Net(prim算法,最小生成树问题)
2016-07-24 00:00
465 查看
看图便知道:
来来上代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int tu[n+1][n+1];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d",&tu[i][j]);
int V[n+1];//存放生成的节点
for(int i=1; i<=n; i++)
V[i]=tu[1][i];//先初始化,别急,后面的会变的
bool op[n+1];//标记此节点是否访问过
memset(op,true,sizeof(op));
int sum=0;
op[1]=false;
for(int i=1; i<n; i++)//n-1条边
{
int j=0,k;
/*for(j=1; j<=n; j++)
cout<<V[j]<<" ";
cout<< "~~~~";
for(j=1; j<=n; j++)
cout<<op[j]<<" ";
cout<<endl;*/
int min=0x3f3f3f3f;
int flag=0;
for(int j=1; j<=n; j++)
if( op[j]&&V[j]<min)//找节点中权值最小的并且是没有找过的
{
min=V[j];
flag=j;//记录下来
}
/*system("pause");
cout<<"min="<<min<<" flag="<<flag<<endl;*/
op[flag]=false;//此节点已经访问过
sum+=min;//加起来
/*for(j=1; j<=n; j++)
cout<<V[j]<<" ";
cout<< "~~~~";
for(j=1; j<=n; j++)
cout<<op[j]<<" ";
cout<<endl;*/
for(j=1; j<=n; j++)
if(op[j]&&tu[flag][j]<V[j])//在刚才找的节点后面继续找此节点后面权值的最小的节点
{
V[j]=tu[flag][j];//放到最生成树的节点中
k=j;
}
/*system("pause");
cout<<endl;
cout<< "V[k]="<< V[k]<<endl;
}*/
printf("%d\n",sum);
}
return 0;
}
/*
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
*/
/*
6
0 6 1 5 7 5
6 0 5 10 3 9
1 5 0 5 6 4
5 10 5 0 8 2
7 3 6 8 0 6
5 9 4 2 6 0
*/
相关文章推荐
- 61条面向对象的法则
- SMS的体系结构
- 软件开发入门学习的个人看法
- 算法学习(数据结构)-程序员必回
- 数据结构中各种树
- 欢迎使用CSDN-markdown编辑器
- 数据结构笔记--haffman树与haffman编码分析
- 数据结构笔记--通过与BF算法的比较理解KMP算法
- 数据结构笔记--循环队列分析
- 数据结构笔记--二叉树的非递归遍历与按层遍历分析
- php基本语法及基本数据结构(一)
- POJ 3450--->Corporate Identity(后缀数组求多个字符串的公共子串)
- SDUT 3346 数据结构实验之二叉树七:叶子问题
- HDU 1671 phone list 数据结构+Trie树(字典树、前缀树)
- SDUT 3344 数据结构实验之二叉树五:层序遍历
- 线性表——单链表
- 线性表——顺序表
- 《数据结构》2.6单链表应用举例
- POJ 2406 Power Strings 数据结构+KMP
- HDU 1867 A + B for you again 数据结构+KMP简单应用