摘要:
可以把一对夫妇当成一个节点,然后拆点的话,h和w分别为真和假,然后直接按照题目中说的建图染色即可#include #include #include #include #include #include using namespace std;const int maxn = 100;const int maxm = 1000;struct node{ int v,next;}edge[maxm];int res[maxm][2],head[maxn],low[maxn],dfn[maxn],stack[maxn],in[maxn],fa[maxn],ha[maxn];int colo... 阅读全文
摘要:
后缀数组——处理字符串的有力工具作者:罗穗骞2009年1月 【摘要】 后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。可以说,在信息学竞赛中后缀数组比后缀树要更为实用。本文分两部分。第一部分介绍两种构造后缀数组的方法,重点介绍如何用简洁高效的代码实现,并对两种算法进行了比较。第二部分介绍后缀数组在各种类型题目中的具体应用。 【关键字】 字符串,后缀,后缀数组,名次数组,基数排序, 【正文】一、后缀数组的实现 本节主要介绍后缀数组的两种实现方法:倍增算... 阅读全文
摘要:
#include #include #include #include #include using namespace std;const int maxn = 1000;const int maxm = 100000;const int inf = 10000000;struct node{ int v,flow,next;}edge[maxm];int head[maxn],dis[maxn];int id,s,t,n,m;void add_edge(int u,int v,int flow){ edge[id].v = v;edge[id].flow = flow;edge... 阅读全文
摘要:
由于被小孩子不喜欢的糖果的对小孩产生的效力是一样的,所以我们在网络流的时候先不考虑。1 - 源点0到1~N个糖果,容量为1,费用为02 - 根据like数组,like[i][j] == 1时在糖果j和人N+i之间建立有一条边,容量为1,费用为03*- 根据b[i]和K的值建立小孩和汇点之间的边:如果b[i] 是 K 的倍数, 说明花费b[i] / K个喜欢的糖果可以达到b[i],建立一条边,费用为K,容量为b[i] / K;否则,将这条边拆为两部分,第一部分是b[i] / K的部分,第二部分根据b[i] % K的部分。(如果b[i] % k == 0,说明b[i]是k的倍数;若b[i]... 阅读全文
摘要:
/*** 无向图拆点,求最大流,最大流即为割点个数。*/#include #include #include #include #include using namespace std;const int maxn = 410;const int maxm = 100100;const int INF = 200000000;struct node{ int v,flow,next;}edge[maxm];int head[maxn],dis[maxn],aug[maxn];int n,m,s,t,id;void add_edge(int u,int v,int flow){ e... 阅读全文
摘要:
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2485题目要求:删除最少的点,使得源点到汇点的距离大于k思路:拆点、建图求费用小于等于k的最大流#include #include #include #include #include using namespace std;#define min(x,y) (x)que; que.push(source); while( !que.empty()){ int u = que.front(); que.pop(); vis[u] = 0; ... 阅读全文
摘要:
#include #include #include #include #include using namespace std;const int maxm = 50000*4;const int maxn = 110;struct node{ int v,cost,flow,next;//v表示指向的下一个顶点,a表示系数,flow表示可以过的流量}edge[maxm];int head[maxn],dis[maxn],pre[maxn],cur[maxn],vis[maxn],aug[maxn];int s,t,v,n,m,k,id,flow;void add_edge(int u... 阅读全文
摘要:
一开始题目没看清楚,以为是增加那条边后还有多少桥,所以就当做是无向图tarjan缩点后建树,然后求u,v的最近公共祖先,一直wa。后来再看题目后才发现边放上去后不会拿下来了,即增加i条边后桥的数量。#include #include #include #include using namespace std;const int maxn = 100100;const int maxm = 200100;struct node{ int v,next;}edge[maxm*2];int head[maxn],low[maxn],dfn[maxn],fa[maxn],stack[maxn]... 阅读全文
摘要:
/*** 题目要求过最少k条边的最短路*/#include #include #include #include #include using namespace std;const int maxn = 5010;const int maxm = 200010;const int INF = 1que; tmp.v = s,tmp.num = 0; dp[tmp.v][tmp.num] = 0; vis[tmp.v][tmp.num] = 1; que.push(tmp); while( !que.empty()){ now = que.front... 阅读全文
摘要:
#include #include #include using namespace std;const int maxn = 2100;struct node{ int v,next;}edge[maxn*maxn];int head[maxn],res[1005*1005][2],low[maxn],dfn[maxn],stack[maxn],in[maxn];int n,m,id,clock,top;void add_edge(int u,int v){ edge[id].v = v;edge[id].next = head[u];head[u] = id++;}void i... 阅读全文