摘要: 题意: 给出有n 个节点的网络,和m条单向边,知道了每条边的容量,问哪些边满足增加该边的容量后,能使得从起点到终点的总流量增加(只能修改一条边!)。分析:如果某条边是该关键边,首先满足该边一定能满流,其次要有从 s 到 t 经过该边的可行路径。 先求最大流,找出割边,在正向网络上从 s 开始深搜,将遍历到点用v1[]标记,在反向网络上从 t 深搜,将遍历到的点用v2[]标记, 如果某条边满足 e[i].cap=e[i].flow且v1[e[i].from]=1,e[e[i].to]=1,那么该边即为要求的关键边。#include<stdio.h>#include<string 阅读全文
posted @ 2012-08-24 23:10 'wind 阅读(200) 评论(0) 推荐(0)
摘要: 题意: 有 n 个人,他们之间的关系有四种,给出一些关系 a,b 表示b 知道 a,现在想把这些人分成两组,每个组里面所有人都相互知道,如果可以分成这两组, 找出两组人数相差最少的情况。分析:如果 a 和 b 不是相互知道,就在a,b之间连一条双向边,表示a 和b 绝不能分在一个组里 建好图之后,进行染色,判断是否是二分图,如果不是二分图,肯定不存在符合条件的情况 染色的同时,记录每个连通块中每个部分的个数,并记录路径 用 01 背包标记所有存在的状态,找到差值最小的情况#include<stdio.h>#include<string.h>#define clr(x)m 阅读全文
posted @ 2012-08-24 19:56 'wind 阅读(1219) 评论(0) 推荐(1)
摘要: 题意: 给出n 个数,每个数的范围在1..k之间,问最短非子序列的长度是多少。分析:将集合尽可能划分成多个区间,并满足每个区间包含1..k之间所有的数,如果分成了 x 个区间,那么这些区间一定包含了所有长度为 x 的子序列,而没有包含全 部的长度为 x+1 的子序列,因为可以通过在每个区间任取一个数来组成长度为 x 的序列。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int v[10005];int main(){ int n,k,p,i,res,num; while(sca 阅读全文
posted @ 2012-08-24 12:39 'wind 阅读(972) 评论(0) 推荐(0)