hdu1102 最小生成树 特殊处理
来源:互联网 发布:wps office for linux 编辑:程序博客网 时间:2024/06/03 19:32
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">该题是最小生成树的变形,因为给出的是任何两个点之间的距离,且其中某些路已经修理,问额外修理的路的总长是多少</span>
如果按最小生成树的算法来算,比如 ,我用的是prim算法,刚开始使用的时候,我的想法是这样,用used[]数组来储存某点是否已经用过,如果a和b点已经修过了路,则used[a]和used[b]都赋值为1,然后把两点间的距离设置为0,再把两点push到优先队列中。
而这种想法是错的,因为即时所有的点都used了,但是可能会出现,所有点不是一个连通图,比如共4个点,可能会出现1-2,3-4这样的连法。
所以最后又想了一下, 如果已经修路,只把两条路间的距离设置为0即可,这样就能保证,在计算的时候,能把这两点的那条路给计算进去。
贴代码:
#include <cstdio>#include <iostream>#include <utility>#include <queue>#include <vector>#include <cstring>#include <string>using namespace std;int N;//N 个村庄const int V_MAX = 105;typedef pair<int, int> P;int cost[V_MAX][V_MAX];vector<int> G[V_MAX];int used[V_MAX];int prim(){ int sum = 0; int Q; priority_queue<P, vector<P>, greater<P> > pque; scanf("%d", &Q); for(int i=1; i<=Q; i++) { int fir, sec; scanf("%d%d", &fir, &sec); cost[fir][sec] = 0; cost[sec][fir] = 0; } pque.push(P(0,1)); while(!pque.empty()){ P temp = pque.top(); pque.pop(); int V = temp.second; int cos = temp.first; if(used[V]!=1){ sum += cos; used[V] = 1; } for(int i=1; i<=N; i++) { if((used[i]!=1)&&(V!=i)) pque.push(P(cost[V][i],i)); } } return sum;}int main(){ while(scanf("%d", &N)!=EOF) { memset(used, 0, sizeof(used)); memset(G, 0, sizeof(G)); int temp; for(int i=1; i<=N; i++) { for(int j=1; j<=N; j++) { scanf("%d",&cost[i][j]); } } printf("%d\n",prim()); } return 0;}
0 0
- hdu1102 最小生成树 特殊处理
- hdu1102最小生成树
- hdu1102 最小生成树
- hdu1102 最小生成树
- hdu1102 最小生成树
- HDU1102 prim 最小生成树
- hdu1102 kruscal最小生成树
- hdu1102 Constructing Roads 最小生成树+prim
- hdu1102 Constructing Roads 最小生成树Prim
- HDU1102 Constructing Roads 最小生成树
- hdu1102 Constructing Roads 最小生成树Prim
- Hdu1102 - Constructing Roads - 最小生成树
- HDU1102 Constructing Roads 【最小生成树Prim】
- HDU1102 Constructing Roads(最小生成树)
- hdu1102(Constructing Roads)--prim最小生成树
- HDU1102 Constructing Roads(最小生成树)
- HDU1102 Constructing Roads 最小生成树
- hdu1102 Constructing Roads------最小生成树
- Android Studio的Gradle添加重复依赖的问题
- 【Java多线程编程】选号程序
- iOS二维码
- LeetCode:Minimum Depth of Binary Tree
- Android 在WindowManager添加View进行绘制时,限制在Window内部绘制和允许绘制到窗口之外区域的方法
- hdu1102 最小生成树 特殊处理
- 南大软院大神养成计划——第五天
- python学习笔记(3)
- 多线程——控制线程状态
- Android 注册
- Android之Handler用法总结
- 《c语言从入门到精通》看书笔记——第4章 运算符与表达式
- HTML5 媒体元素--------video
- C和C++的关系