usaco 3.1 Agri-Net
2015-09-12 19:04
369 查看
给一个邻接矩阵求最小生成树的权值。
最简单的prim就行,但我写了加堆优化的prim。以提高效率。
最简单的prim就行,但我写了加堆优化的prim。以提高效率。
/* ID: modengd1 PROG: agrinet LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <queue> using namespace std; int N; int input[100][100]; struct node { int E,W; node(int ee,int ww) { E=ee;W=ww; } node(){} bool friend operator<(node n1,node n2) { return n1.W>n2.W; } }; void prim() { int dist[100];//未加入的点离当前已生成的最小生成树的最近的距离,次数足可以不要,加上以后可以优化队列大小 bool vis[100];//i点是否已经加入当前最小生成树 int ans=0; priority_queue<node> Q; memset(vis,false,sizeof(vis)); memset(dist,0x7f,sizeof(dist)); Q.push(node(0,0));//加入第一个点 while(!Q.empty()) { node now=Q.top(); Q.pop(); if(!vis[now.E])//此点未加入 { ans+=now.W;//更新当前已生成的最小生成树 vis[now.E]=true; for(int i=0;i<N;i++)//检查从此点连出的边是否会更新未加入的点离已生成的树的距离 { if(vis[i]) //从此点伸出的边相连的点已经在当前生成树中了 continue; if(dist[i]<input[now.E][i])//从此点伸出的边到达未加入的点的距离大于以前加入的 continue; dist[i]=input[now.E][i]; Q.push(node(i,input[now.E][i])); } } } cout<<ans<<endl; } int main() { freopen("agrinet.in","r",stdin); freopen("agrinet.out","w",stdout); scanf("%d",&N); for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { scanf("%d",&input[i][j]); } } prim(); return 0; }
相关文章推荐
- EI企划网index.css
- [C++] memcopy 和 memmove的区别和实现
- typedef与#define的区别
- 一定要减少用户从网络获取资源的成本
- error:[NSNull length]: unrecognized selector sent to instance 0x198dd6690'
- connect to host **** port 22: Connection refused
- 自己动手做Android音乐播放器(续)
- STM32 TIMER OUTPUT DIAGRAM
- 【转】js/jquery中刷新iframe方法(兼容主流)
- [错误记录]tableviewcell问题
- STM32 TIMER DIAGRAM
- 手机行业洗牌 大佬们就该欣喜若狂?
- STM32 TIMER REGISTER
- 什么是实例化?
- 你想成为优秀的Java程序员吗?
- python模拟新浪微博登陆之获取cookies
- 几何题目总结——9月省赛惨败的教训
- 算法基础: 大数除法-二分法
- LPC-LINK 2 LPC4337 TQFP144 IO
- [C++] struct 内存对齐问题