摘要: #include#include#include#include#define N 2000#define M 1000010#define inf 1=n)return flow-lv; if(lv==0) break; } if(d[v]>1; memset(index,-1,sizeof(index)); for(i=1;in)建立一个流量为1的边,从每个人向每个他从属的组织建立一条流量为1的边,在由每个组织建立一条流向汇点的边,我们可以二分枚举组织向汇点边的流量。 阅读全文
posted @ 2013-07-16 16:23 fangguo 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 思路:由(i+j)为偶数的点向(i+j)为奇数的点建边。求一次最大匹配,若正好为空格数(不包含洞)的一半,即输出YES。#include#include#include#include#define Maxn 1101using namespace std;int n,m,vi[Maxn],match[Maxn],graphic[Maxn][Maxn],map[40][40],N[Maxn],M[Maxn],x,y;int dfs(int u){ int i; for(i=1;i<=y;i++) { if(!vi[M[i]]&&graphic[u][M[i]])... 阅读全文
posted @ 2013-07-16 15:23 fangguo 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 就是最简单的最大匹配,没的说#include#include#include#include#define Maxn 310using namespace std;int n,m,vi[Maxn],match[Maxn],graphic[Maxn][Maxn];int dfs(int u){ int i; for(i=1;i<=m;i++) { if(!vi[i]&&graphic[u][i]) { vi[i]=1; if(match[i]==-1||dfs(match[i])) {... 阅读全文
posted @ 2013-07-16 13:07 fangguo 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 思路:我们首先来一遍拓扑排序,将点按先后顺序排列于一维数组中,然后扫描一遍数组,将每个点的出边所连接的点进行更新,即可得到最优解。#include#include#include#include#include#define inf 2000000010#define Maxn 100010#define Maxm 1000010using namespace std;int dist[Maxn],vi[Maxn],index[Maxn],e,value[Maxn],indegree[Maxn],outdegree[Maxn],ans[Maxn],num,n;struct Edge{ i... 阅读全文
posted @ 2013-07-16 10:08 fangguo 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 题意:求一个拓扑排序,使其weight是递增的,当有多个序列存在是,要求首先使1号的weight最小,然后是2号....解题思路:对于一个有向无环图,若按质量轻的往质量大的建边,那么当有多个入度为0的点存在时,不能确定将哪个放在前面能使其最终序列最优,但反过来思考,对于出度为0的所有点,其中编号最大的让其排到最后面,那么结果一定是最优的。#include#include#include#define Maxn 402#define Maxm 40010using namespace std;int graphic[Maxn][Maxn],indegree[Maxn],n,m,ans[Maxn] 阅读全文
posted @ 2013-07-15 21:18 fangguo 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 这题主要在于建图。对9个2*2的小块,第i块如果出现了不等于i的数字,那么一定是在i之后被brought的。可以从i到该数字建一条边。图建好后,进行一次拓扑排序,判段是否存在环。若存在环,那么就是BROKEN,否则是CLEAN。#include#include#include#define Maxn 102#define Maxm 10010using namespace std;int graphic[Maxn][Maxn],indegree[Maxn],n,m,map[Maxn][Maxn],vi[10];int Topsort(){ int i,j,k,num=0; for(... 阅读全文
posted @ 2013-07-15 14:01 fangguo 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 这题就是朴素的拓扑排序,只是一开始题意没看清楚,不太清楚几种结果的优先级。优先级其实就是给的测试数据的结果。#include#include#include#include#include#define Maxn 102#define Maxm 10010using namespace std;int graphic[Maxn][Maxn],indegree[Maxn],n,m,e;char ans[Maxn];int Topsort(){ int i,j,k,num,temp,f=0; temp=0; for(i=1;i1) f=1; f... 阅读全文
posted @ 2013-07-15 12:31 fangguo 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 次小生成树的求法:1.Prime法定义一个二维数组F[i][j]表示点i到点j在最小生成树中的路径上的最大权值。有个知识就是将一条不在最小生成树中的边Edge加入最小生成树时,树中要去掉的边就是Edge连接的两个端点i,j的F[i][j]。这样就能保存找到的生成树时次小生成树。代码如下:#include#include#include#include#include#define inf 1map[index][j]) { dist[j]=map[index][j]; pre[j]=index; ... 阅读全文
posted @ 2013-07-14 18:51 fangguo 阅读(169) 评论(0) 推荐(0) 编辑
摘要: #include#include#include#include#includeusing namespace std;int len[22],n,El;int vi[22];int dfs(int k,int pos,int nowlen){ int i,j; if(nowlen==El) { if(k==n) return 1; else nowlen=0,pos=0; } for(i=pos;iMax) Max=len[i]; sum+... 阅读全文
posted @ 2013-07-08 20:43 fangguo 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 对于网络流有一个定理:最小点权覆盖集=最大网络流;最大点权独立集=总权值-最小点权覆盖集;网络流解法代码如下:#include#include#include#include#define N 1010#define M 50010#define inf 1=n)return flow-lv; if(lv==0) break; } if(d[v]1) addedge(pos(i,j),pos(i-1,j),inf); if(j>1) ... 阅读全文
posted @ 2013-07-08 18:38 fangguo 阅读(257) 评论(0) 推荐(0) 编辑