2011年9月30日
摘要: UVA_10806 这个题目我们可以把边的容量设为1,费用设为权值,然后再引入一条边N-N+1,容量设为2,费用设为0,然后去求1到N+1的最小费用最大流,如果到N+1的流量为2,则输出最小费用,否则就是无解。在老大的指点下,自己亲手把以前没有写过的费用流的邻接表形式写了一遍。费用流应用邻接表时需要注意三个问题:①要把一条边的正向边和反向边各建一次,如果是无向图,可以把一个无向边看成两个有向边,然后建四条边存储。②在建边时多开一个数组op[],用于存储此边的反向边的标号,便于增广。③在记录父节点时,同时多开一个数组edge[],用于记录父节点连向该节点的有向边的标号,用于增广。有了邻接表形式的 阅读全文
posted @ 2011-09-30 23:28 Staginner 阅读(428) 评论(0) 推荐(0) 编辑
摘要: UVA_10608 为了计数方便,我们在初始化并查集的数组p[]时全部初始化成-1,让树根的p[]值代表该集合内的人数。在合并时,令p[tx]+=p[ty]即相当将两组的人数进行了相加,同时令p[ty]=tx即让两组数据同时指向了一个树根。#include<stdio.h>#include<string.h>int N,M,p[30010];int find(int x){ return p[x]<0?x:(p[x]=find(p[x])); }void init(){ int i,x,y,tx,ty; scanf("%d%d",&N, 阅读全文
posted @ 2011-09-30 21:29 Staginner 阅读(386) 评论(3) 推荐(0) 编辑
摘要: UVA_10099这个题目实际上要求所有路径中最小边的最大值。由于Floyd代码写起来很清晰,也比较容易解决这类问题,所以我就直接写了Floyd。 但是由于这个题目只有一组查询,所以Floyd的优势就不那么明显了,听了老大的思路之后,我便又写一个二分的程序,果然比Floyd快很多。#include<stdio.h>#include<string.h>int f[110][110];int main(){ int i,j,k,u,v,w,n,S,T,D,N,R,t,ans; t=0; while(1) { scanf("%d%d",&N,&am 阅读全文
posted @ 2011-09-30 14:15 Staginner 阅读(540) 评论(3) 推荐(0) 编辑