poj 1258
2016-08-02 11:32
253 查看
题目概述
一个图上有N个节点,给定其邻接矩阵,求最小生成树总长度时限
1000ms/3000ms输入
第一行正整数N,其后N行,每行N个整数,代表邻接矩阵,输入到EOF为止限制
3<=N<=100;矩阵元素值<=1e5输出
每行一个数,为所求最小生成树总长度样例输入
40 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
样例输出
28讨论
图论,最小生成树,用prim足矣,之前不是很熟悉,参考了几篇题解,基本能正确的写出来了题解状态
208K,16MS,C++,880B题解代码
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; #define INF 0x3f3f3f3f #define MAXN 102 #define memset0(a) memset(a,0,sizeof(a)) int N;//节点总数 int graph[MAXN][MAXN], dis[MAXN];//graph 邻接矩阵 distance 桥边长度 bool mk[MAXN];//marked 标记是否在树中 int fun() { for (int p = 0; p < N; p++) for (int i = 0; i < N; i++) scanf("%d", &graph[p][i]);//input mk[0] = 1;//先将0放入树中 下面是prim算法主体 for (int p = 0; p < N; p++) dis[p] = graph[0][p];//以0节点到其他点权值初始化dis数组 int sum = 0;//记录树总长度 for (int p = 1; p < N; p++) {//再运行N-1次 int least = INF, pos;//least 最短桥边长度 position 最短桥边连接的点 for (int i = 0; i < N; i++)//找出最短桥边 if (!mk[i] && least>dis[i]) { least = dis[i]; pos = i; } sum += least; mk[pos] = 1;//将其连接的点加入树 for (int i = 0; i < N; i++)//更新桥边长度 if (!mk[i] && dis[i]>graph[pos][i]) dis[i] = graph[pos][i]; } return sum; } int main(void) { //freopen("vs_cin.txt", "r", stdin); //freopen("vs_cout.txt", "w", stdout); while (~scanf("%d", &N)) {//input printf("%d\n", fun());//output memset0(mk); } }
EOF
相关文章推荐
- 掘金量化回测平台 - 1
- 当效率至关重要时map::operator[]与map.insert之间的选择
- 【LeetCode】 066. Plus One
- Android Storage Access Framework(存储访问框架)
- java网络编程(一)使用TCP协议完成客户端与服务端的数据传递
- 守护进程编程惯例
- Spark 概念学习系列之Spark生态(十四)
- Spark生态之SparkR
- MVC模型绑定
- c++实现二维动态数组
- PAT1087
- Android实现机制(三)——View事件分发机制
- 浅谈struts
- Spark生态之Spark BlinkDB
- Could not load file or assembly 'Microsoft.AnalysisServices.SharePoint.Integration'
- HAProxy 基本翻译
- 配置泛微OA支持修改AD密码
- zookeeper详解(三)-- paxos算法以及zookeeper中的实现
- AUI中的tapmode属性详解
- jQuery源码研究分析学习笔记-jQuery.buildFragment()(六)