上一页 1 ··· 65 66 67 68 69 70 71 72 73 ··· 85 下一页
  2011年10月25日
摘要: UVA_125 由于a->b的路径条数等于a->i与i->b的路径条数的乘积之和,因此在用floyd的过程中我们就可以算出a->b之间的路径条数,同时,如果a->b有无线条路径的话,那么一定存在a->b路径上的某点k使得f[k][k]!=0的。#include<string.h>#include<stdio.h>#define MAXD 110int M, N, f[MAXD][MAXD];void init(){ int i, j, a, b; N = 0; memset(f, 0, sizeof(f)); for(i = 0; i 阅读全文
posted @ 2011-10-25 09:57 Staginner 阅读(506) 评论(3) 推荐(0) 编辑
摘要: HDU_3879由于最终收益=所有可能收益-(损失的收益+架设费用),因此我们可以转而用最小割去求损失的收益与架设费用之和。在建图的时候源点与用户相连,容量为每个用户带来的收益,架设点与汇点相连,容量为架设每个点所需的费用,之后将用户需要的两个点与该用户相连,容量为INF。建好图之后,左边的流量就代表损失的收益,右边的流量就代表架设费用之和,之后求此图的最小割即可。#include<string.h>#include<stdio.h>#define MAXD 60000#define MAXM 400000#define INF 1000000000int first[ 阅读全文
posted @ 2011-10-25 09:43 Staginner 阅读(360) 评论(0) 推荐(0) 编辑
  2011年10月20日
摘要: UVA_515这个题目是一个差分约束系统的题目。我们设S[i]为第1至i个数的和,特别的,S[0]=0,根据题意可以列出如下三类不等式:①当符号为gt时:S[s+n]-S[s-1]>=k+ 1。②当符号为lt时:S[s+n]-S[s-1]<=k-1。③S[i]-S[i-1]>=-INF(0<i<=N)。然后依据这些不等式进行建图后,用SPFA求最短路即可。其中第③个式子主要是使图连通起来,同时,为了在使用SPFA时开始的时候只需将一个点入队,我们可以引入一个点作为第N+1个数字,且使S[N+1]=0(这个值是不是为0倒没有关系,只要合理即可),同时将第③个式子的- 阅读全文
posted @ 2011-10-20 03:52 Staginner 阅读(343) 评论(0) 推荐(0) 编辑
摘要: UVA_558 这个题目实际上就是在让我们判断原图是否存在负圈,如果使用SPFA的话,当一个点的入队次数大于N时,就可以说明原图存在负圈了。#include<stdio.h>#include<string.h>#define MAXD 1010#define MAXM 2010#define INF 1000000000int d[MAXD], q[MAXD], inq[MAXD], inedq[MAXD];int N, M, first[MAXD], e, next[MAXM], v[MAXM], w[MAXM];void add(int a, int b, int 阅读全文
posted @ 2011-10-20 00:32 Staginner 阅读(276) 评论(0) 推荐(0) 编辑
摘要: UVA_10986 一个裸的最短路问题,直接用队列优化的Bellman-Ford求解即可。#include<stdio.h>#include<string.h>#define MAXD 20010#define MAXM 100010#define INF 1000000000int N, M, S, T, q[MAXD], inq[MAXD];int first[MAXD], next[MAXM], v[MAXM], w[MAXM], d[MAXD], e;void add(int a, int b, int c){ w[e] = c; v[e] = b; next[ 阅读全文
posted @ 2011-10-20 00:08 Staginner 阅读(241) 评论(0) 推荐(0) 编辑
  2011年10月17日
摘要: UVA_10158和杭电那个食物链是差不多的,并且还少了一种关系的表示。思路就是用并查集把相互产生关系的元素放到一起,并用一个数组delta[]来表示和根节点的关系,0表示friend,1表示enemy。在进行合并操作以及压缩路径的时候要注意把当前节点相对于父节点的关系用类似向量的运算转化成相对于根结点的关系。#include<stdio.h>#include<string.h>#define MAXN 10010int N, p[MAXN], delta[MAXN];int find(int x){ if(p[x] == x) return x; int tx = . 阅读全文
posted @ 2011-10-17 13:56 Staginner 阅读(372) 评论(0) 推荐(0) 编辑
摘要: UVA_10985L和R的间距能拉多远是取决于L与R之间的最短路,因此,水平悬挂的绳一定是L和R之间最短路的一个部分。而水平的Ring一定满足到L与R的距离和是L与R之间最短路的长度,因此我们可以先把所有水平的Ring找出来,符合要求的线一定是这些水平Ring之间的连线,但水平Ring之间的连线不一定符合要求(当两个Ring位于同一位置且恰好两者之间有一条连线,这条连线就不符合要求)。因此,思路就是先用Floyd做最短路,然后枚举L、R并计算符合要求的连线的数目即可。#include<stdio.h>#include<string.h>#define MAXD 150# 阅读全文
posted @ 2011-10-17 02:29 Staginner 阅读(402) 评论(0) 推荐(0) 编辑
  2011年10月16日
摘要: UVA_10594 这个题目没看懂什么意思,但看样例觉得应该是把边的容量都设成K,把费用设成时间,然后求个从1到N的最小费用流。为了限制流量,我们可以连一条容量为D、费用为0的0->1这样的有向边,然后求图的最小费用最大流即可。#include<stdio.h>#include<string.h>#define MAXD 110#define MAXM 20100const long long int INF = 10000000000000000ll;int first[MAXD], next[MAXM], v[MAXM], a[MAXM], b[MAXM], 阅读全文
posted @ 2011-10-16 22:09 Staginner 阅读(463) 评论(2) 推荐(0) 编辑
  2011年10月14日
摘要: HDU_1569 一开始没有什么思路,后来看了别人的解题报告说要去构造一个二分图转化成最小割去做。后来我又琢磨了一下,大概原理是这样的,如果把原图按i+j的奇偶性分成两部分(也就是染成国际象棋棋盘那样),并且相邻的格子之间连一条边的话,就变成了求最大权独立集了,而最大权独立集又等于SUM减去最小点权覆盖集,这样我们就转化成去求最小点权覆盖集了。而如果我们构造一个超级源点和二分图左边所有点相连并且边权为格子的权值,同时另二分图右边所有点和构造的一个超级汇点相连并且边权为格子的权值,并且把二分图中间的边的边权设为INF,这样求出的最小割就是最小点权覆盖集。因为如果是最小点权覆盖集的话,拿掉这些点. 阅读全文
posted @ 2011-10-14 18:39 Staginner 阅读(373) 评论(0) 推荐(0) 编辑
摘要: HDU_1565一开始没有什么思路,后来看了别人的解题报告说要去构造一个二分图转化成最小割去做。后来我又琢磨了一下,大概原理是这样的,如果把原图按i+j的奇偶性分成两部分(也就是染成国际象棋棋盘那样),并且相邻的格子之间连一条边的话,就变成了求最大权独立集了,而最大权独立集又等于SUM减去最小点权覆盖集,这样我们就转化成去求最小点权覆盖集了。而如果我们构造一个超级源点和二分图左边所有点相连并且边权为格子的权值,同时另二分图右边所有点和构造的一个超级汇点相连并且边权为格子的权值,并且把二分图中间的边的边权设为INF,这样求出的最小割就是最小点权覆盖集。因为如果是最小点权覆盖集的话,拿掉这些点及其 阅读全文
posted @ 2011-10-14 18:38 Staginner 阅读(602) 评论(0) 推荐(0) 编辑
上一页 1 ··· 65 66 67 68 69 70 71 72 73 ··· 85 下一页