上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 34 下一页
摘要: 题目大意】给出一个带权无向图,问其最小生成树是否唯一,若唯一输出其权值和,否则输出"Not Unique!".1.其实,在判断最小生成树是否是唯一的时候,用到了次小生成树的思想,求一棵次小生成树,最次小生成树的总权值等于最小生成树的权值,则不唯一;这里涉及到求次小生成树的问题,首先用prim 算法求一个最小生成树, 再做一次添边和删边的操作,添加一条最小生成树外的边,此时必在最小生成树上形成环,在删去环上权值最大的边,求出添删操作中差额最小值,若最小值为0,则不唯一,否则唯一;(这里我是这样做的,在pime算法求最小生成树的过程中,有一个增加生成树节点的操作,每增加一个节点 阅读全文
posted @ 2011-08-19 03:12 枕边梦 阅读(770) 评论(3) 推荐(1) 编辑
摘要: 这题目郁闷了整整一天,虽然看了黑书上的解释,解题的思路也基本了解,但实现代码仍是一条漫长的路呀算法流程:假设V0为被限制的点,即公园,(1)找{V1,V2,....,Vn}所有的联通分量,求出每个连通分量的最小生成树Ti。(2)在每个连通分量中,选择V0相邻的最小边,得到Ht。Min<--Ht,V<--cost(Ht)。时间复杂度为O(n)。(3)循环i<--t+1 to k do 在H(i-1)上选择“差额最小添加操作”,添加并删除一条边得到Hi,令V<V+cost(添边)-cost(删边), 若V<Min,令Min<--V;如果找不到“差额最小添删操作” 阅读全文
posted @ 2011-08-18 02:44 枕边梦 阅读(404) 评论(0) 推荐(1) 编辑
摘要: 这来到题目差不多,因为几乎是每条边都用到,所以用prim算法应该会比较好,从运行的效率来看也十分明显hdu1875 则对边做了一定的限制,只需要的加边的时候判断一下就好了hdu 1162 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<string>#include<math.h>#define MAXN 101 #define MAXINT 99999999using namespace std;int n,s[MAXN];double dis[MAXN], 阅读全文
posted @ 2011-08-16 18:25 枕边梦 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 还是一道差不多一样的最小生成树的题目,数据量本来也不大,Kruskal 算法直接过#include<iostream>#include<string>#include<algorithm>using namespace std;struct edge{ int u,v,w; edge(int x=0,int y=0,int z=0):u(x),v(y),w(z){};};edge e[80];int n,m,ans;int f[30];int find(int x){ if(x==f[x]) return x; f[x]=find(f[x]); return 阅读全文
posted @ 2011-08-16 17:28 枕边梦 阅读(204) 评论(0) 推荐(0) 编辑
摘要: hdu1102#include<iostream>#include<string>#define MAXINT 9999999using namespace std;int map[101][101],s[101],dis[101],n;int prim(){ int sum=0; memset(s,0,sizeof(s)); s[1]=1; for(int i=2;i<=n;i++) dis[i]=map[1][i]; dis[1]=0; for(int i=1;i<n;i++) { int min=MAXINT,k=1; for(int j=1;j< 阅读全文
posted @ 2011-08-16 01:21 枕边梦 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 用Kruskal算法求最小生成树,要用到并查集,最后再顺便用并查集判断是否连通,只需判断父节点数是否唯一#include<iostream>#include<string>#define MAXN 101using namespace std;int n,m,f[MAXN],ans;struct edge{ int u,v,w; edge(int x=0,int y=0,int z=0):u(x),v(y),w(z){};}e[MAXN*50];int cmp(const void *a, const void *b) { if(((struct edge *)a)-& 阅读全文
posted @ 2011-08-16 00:36 枕边梦 阅读(191) 评论(0) 推荐(0) 编辑
摘要: prim实现#include<iostream>#include<string>#define MAXINT 9999999using namespace std;int map[101][101],s[101],dis[101],n;int prim(){ int sum=0; memset(s,0,sizeof(s)); s[1]=1; for(int i=2;i<=n;i++) dis[i]=map[1][i]; dis[1]=0; for(int i=1;i<n;i++) { int min=MAXINT,k=1; for(int j=1;j< 阅读全文
posted @ 2011-08-15 23:56 枕边梦 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 【题目大意】: 给出一个超市24小时各需要R[i]个雇员工作,有N个雇员可以雇佣,他们开始工作时间分别为A[i],求需要的最少的雇员人数。这题目在黑书上有详细的解析,题目的关键是在构图上,把约束条件找出来,再按照条件加边就OK了,不过,我是参考课件里面才过的【算法分析】: 用差分约束,难点是建立模型。设X[i]为0-i小时内工作的人数(X[24]即为所求),R[i]为第(i-1)-i小时时需要在工作的人数,A[i]可以在第i-1小时开始工作。可以建立起以下约束不等式:0 <= X[i]-X[i-1] <= A[i]; 1 <= I <= 24;X[i] – X[i-8] 阅读全文
posted @ 2011-08-15 12:53 枕边梦 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 题意:有N-1个城市给首都(第N个城市)支援物资,有M条路,走每条路要耗费一定百分比(相对于这条路的起点的物资)的物资。问给定N-1个城市将要提供的物资,和每条路的消耗百分比。求能送到首都的最多的物资数量思路:求前N-1个点各自到达N是所剩物资的最大值,设dis[i]为到达i城市时所剩的物资,则变为求最长路的问题了,所以要对前N-1个节点都做一次最长路,再累加即可。要注意的地方:1)第一是消耗百分比是相对于这条路的起点,第二是无向边。因为第一点,所以不能看成反向的DIJ一次性做完,而是应该把每个点可以送到最多物资依次算出来最后相加。用Bellman松弛边,因为是无向边,而又没有保存两次边,所以 阅读全文
posted @ 2011-08-15 10:32 枕边梦 阅读(579) 评论(0) 推荐(0) 编辑
摘要: Bellman-ford 的变形:题意:一个游戏,要在能量大于0的情况下从room[1]走到room[n]判为赢,不然中途停止或者能量为负判为输,其中房间之间可以是回路,每个房间有自己的能量。由于是求能否到达,当然想尽可能的多增加能量,故用Bellman求最长路。而中间过程中不能使能量为零或负,故在Bellman松弛前加一条件,控制其松弛的点。最后如果能得到终点最长路大于零,则能过关,或者有正圈可以到达终点,也能过关。判断是否连通,用floyd 算法,O(n^3)#include<iostream>#include<string>#define MAXINT 99999 阅读全文
posted @ 2011-08-15 09:48 枕边梦 阅读(168) 评论(0) 推荐(0) 编辑
上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 34 下一页