图论
After0514
这个作者很懒,什么都没留下…
展开
-
CodeForces 429E
red 区间加1 blue 区间减1 可以用前缀和维护 。。。。 然后就是欧拉回路一下#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=2e5+100;const int M=2e5+100;int ll[N],rr[N];i原创 2016-11-10 13:12:59 · 325 阅读 · 0 评论 -
CodeForces 48E
最短路 最长路 有向图找环#include<cstdio>#include<iostream>#include<cstring>#include<queue>using namespace std;const int N=440;const int INF=0x3f3f3f3f;int aa[N],bb[N];int dp[N][N];queue<int> qq;int h,t原创 2016-11-09 16:13:38 · 245 阅读 · 0 评论 -
CodeForces 413E
2*N的矩形,有些位置可以走,有些位置不能走, 问两点之间最短路#include<cstdio>#include<iostream>#include<cstring>#include<vector>#include<cmath>#include<algorithm>using namespace std;const int N=2e5+100;char ss[2][N];int c原创 2016-11-09 13:52:34 · 291 阅读 · 0 评论 -
CodeForces 152E
斯坦纳树+输出方案#include<cstdio>#include<iostream>#include<cstring>const int N=210;const int INF=1e9;int tot;int g[N][N];int mp[N][N];int val[N];int mi[N][N];void flody(){ memset(mi,-1,sizeof(mi)原创 2016-11-08 23:29:40 · 379 阅读 · 0 评论 -
CodeForces 103E
给定n个结合 选出k个集合,并且这k个集合并后的大小也为k,求费用最小, 最大权闭合图#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int N=600+10;const int M=N*N;typedef __int64 LL;const int INF=1e9;struc原创 2016-11-08 21:30:37 · 604 阅读 · 0 评论 -
最大团
///////极大团个数const int N=1000;const int INF=1e8;int g[N][N];int all[N][N],some[N][N],none[N][N],S;void dfs(int d,int an,int sn,int nn){ if(sn==0&&nn==0)++S; int u=some[d][0]; f原创 2016-11-05 11:25:04 · 185 阅读 · 0 评论 -
图染色
#include#include#include#includeusing namespace std;const int N=20+10;char ss[N][N];typedef unsigned LL;int mp[N][N];int top,sta[N],clo[N];int num,vis[N][N],ti,s1;int dfs(int d原创 2016-11-05 11:24:40 · 317 阅读 · 0 评论 -
哈密尔顿回路
////////////竞赛图哈密尔顿路 poj 1776int g[N][N];int sta[N],top;void hami(int n){ top=0; for(int i=1;i<=n;i++){ int id=0; for(int j=top-1;j>=0;j--){ if(g[sta[j]]原创 2016-11-05 11:23:52 · 429 阅读 · 0 评论 -
无向图最大匹配
//hdu 4687int pre[N];int match[N];int fa[N];int Find(int u){ if(u==fa[u])return u; return fa[u]=Find(fa[u]);}void Union(int u,int v){ u=Find(u),v=Find(v); if(u!=v)fa[原创 2016-11-05 11:23:03 · 1524 阅读 · 0 评论 -
CodeForces 375C
http://blog.csdn.net/qq574857122/article/details/17797639?locationNum=2&fps=1状压+最短路 判断一个点在不在路径内,选择一个方向数边的条数,判断奇偶性就好了#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define原创 2016-11-29 13:47:10 · 284 阅读 · 0 评论 -
CodeForces 183C
如果形成一个环,点的个数为cnt,那么ans|cnt, 如果两条单链相交,点个数分别为为cnt1,cnt2,那么ans|abs(cnt1-cnt2) 所以通过加入一条-1的边,把有向图变成无向图,直接求路径长的gcd就好了#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define rep(原创 2016-11-29 13:52:36 · 352 阅读 · 0 评论 -
DLX
// hdu 2828// poj 3740int mx[N][M];int U[nm],D[nm],L[nm],R[nm],X[nm],Y[nm];int S[M],H[N];int sz,ans;void ver(int x,int y){///上 下 D[x]=y;U[y]=x;}void hor(int x,int y){////左 右 R[x]=y;L[y]原创 2016-12-23 15:03:59 · 477 阅读 · 0 评论 -
Codeforces 125E
k度最小生成树#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<map>#include<string>using namespace std;const int N=5000+10;const int inf=1<<30;int g[N][N],dis[N],clo[N],pre[原创 2016-12-23 11:18:26 · 320 阅读 · 0 评论 -
Codeforces21D
为什么没写个Floyd写个Spfa。。。。 度为奇数的点两两匹配,这样所有的点的度数就都为偶数了, 然后就是欧拉回路了, 然后求个最优匹配#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;const int N=20;const int M=2000+10;c原创 2016-12-22 20:48:38 · 253 阅读 · 0 评论 -
Codeforces 346D
建反向图,跑一遍最短路, 更新 1.p[i]=min(p[j])(i->j)+1,当p[j] (i->j)不完全相同 2.p[i]=min(p[j])(i->j),当p[j] (i->j)完全相同#include <cstdio>#include <vector>#include <memory.h>using namespace std;const int MX=1000100,MD原创 2016-12-22 20:27:43 · 278 阅读 · 0 评论 -
Codeforces 83C
求字典序最小的最短路 先求最短路,因为边权都为1,所以直接沿着最短路边广搜出一条 字典序最小的就好了#include<cstdio>#include<iostream>#include<cstring>#include<queue>#include<algorithm>using namespace std;typedef __int64 LL;const int N=51;cha原创 2017-01-02 20:47:18 · 370 阅读 · 0 评论 -
Codeforces 132E
k不相交费用流//HDU 2686#include<cstdio>#include<iostream>#include<cstring>#include<queue>#include<cmath>using namespace std;const int N=500+10;const int M=N*N*2+10;const int INF=0x3f3f3f3f;struct Ed原创 2016-12-05 19:51:34 · 229 阅读 · 0 评论 -
CodeForces 48E
最短路+有向图找环#include<cstdio>#include<iostream>#include<cstring>#include<queue>using namespace std;const int INF=0x3f3f3f3f;const int N=220;const int M=N*N*N;struct Edge{ int v,next; Edge(){原创 2016-12-02 10:10:18 · 229 阅读 · 0 评论 -
CodeForces 37E
官方题解证明 先画一个很大的联通块颜色B 然后在上面的联通块里画一个较小的联通块颜色为W 然后在上面的联通块里画一个较小的联通块颜色为B 。。。 这样的画法一定能得到最优解。。。。然后就变成求BWBWBW交替出现的最短路。。。#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespa原创 2016-11-18 21:14:02 · 362 阅读 · 0 评论 -
CodeForces 444E
并查集#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=3300;struct Node { int u,v,w; Node(){} Node(int u,int v,int w):u(u),v(v),w(w){原创 2016-11-16 19:59:08 · 452 阅读 · 0 评论 -
全局最小割
无向图最小割集//HDU 3002int dis[N][N],del[N];int ww[N],vis[N];int S,T,n;int _search(){ memset(vis,0,sizeof(vis)); memset(ww,0,sizeof(ww)); S=T=-1; int ans=0; while(1){原创 2016-11-05 11:22:12 · 214 阅读 · 0 评论 -
费用流
//HDU 1533int dis[N],vis[N];int path[N],low[N];queue qq;int spfa(int s,int t){ memset(vis,0,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); memset(low,0,sizeof(low)); qq.pu原创 2016-11-05 11:21:18 · 195 阅读 · 0 评论 -
HDU 3395 Special Fish?费用流(虚拟边)?647★KM(加虚拟边权)
题意:给定二分图,求权值最大的匹配,思路:1.KM,因为题目给定的图不是完全图,可能没有完全匹配,所以要加上虚拟的权值为0的边,所有情况,包括权值最大的情况也是属于某一完全匹配的,所以可以直接求KM, 2.费用流:不加虚拟边,求得的是在最大流情况下的权值最大,加上虚拟边后,所有情况,包括最大权值情况都是属于某一最大流,所以直接求费用流费用流:#incl原创 2015-03-23 14:55:32 · 1014 阅读 · 0 评论 -
HDU1385 Minimum Transport Cost 最短路+输出路径★floyd中的路径dp
题意:给定有向图,输出s->t ,的最短路权值,和权值最小下字典序最小的路径思路:floyd,dp[][]扩展到路径字典序上#include"stdio.h"#include"string.h"int n;int tax[111];int map[111][111];int path[111][111];void floyd(){ int temp;转载 2015-03-23 14:54:23 · 450 阅读 · 0 评论 -
HDU1845 Jimmy’s Assignment
转载:http://blog.sina.com.cn/s/blog_677a3eb30100llyn.html题目:http://acm.hdu.edu.cn/showproblem.php?pid=1845,二分图死活tle给一n个点的三正则图,求最大匹配。根据握手定理,n一定是偶数。由于三正则图,而且题目提示是2边连通,所以图中不存在桥,也就是一定可以找到一条回路经过每个顶点至转载 2015-03-29 10:19:31 · 351 阅读 · 0 评论 -
HDU 3870Catch the Theves
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3870题意:平面图求最小割,转化成求最短路#include#include#include#include#include#includeusing namespace std;const int N=410*410;const int M=410*410*4+10;const in原创 2015-03-21 16:48:46 · 411 阅读 · 0 评论 -
WuKong-HDU2833
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2833题意:给定无向图,求两条最短路A->B,C->D,问这两条最短路的公共点最多有多少个思路:1:floyd预处理所有点对最短路: 2:记忆化搜索:首先A->B的最短路径,可以形成一棵有根树,沿着A->B的最短路径形成的树,从A开始搜索,dp[u],表示从u->B原创 2015-03-20 17:09:28 · 404 阅读 · 0 评论 -
HDU-3768Shopping
题目:http://acm.hdu.edu.cn/statistic.php?pid=3768题意:给定无向图,问从0出发遍历所有指定点所需最短时间,点100000,边100000,指定点思路:首先求出所有指定点两两之间的最短路,包括0点,1:直接10!枚举遍历顺序,求出最小值#include#include#include#include#include#includeu原创 2015-03-20 22:46:54 · 354 阅读 · 0 评论 -
spfa判负环优化
题目意思就是是否存在ai,bj,使得l首先,把cij除到两边:l'log(l')把log(ai)和log(bj)看成两个点ai和bj,化成求最短路的形式:dis[ai]-dis[bj]判断有无解(负环)的时候,如果用spfa,不能用入队次数大于N来判断,会超时。有如下两种比较可靠的方法(一般情况下)1:某个点入队次数大于sqrt(N)的时候2转载 2015-03-05 17:09:08 · 686 阅读 · 0 评论 -
HDU 4126 Genghis Khan the Conqueror prim + 树形DP 好题
转载:http://www.cnblogs.com/ACMan/archive/2012/10/07/2713690.html题意:一个N个点的无向图,先生成一棵最小生成树,然后给你Q次询问,每次询问都是x,y,z的形式, 表示的意思是在原图中将x,y之间的边增大(一定是变大的)到z时,此时最小生成数的值是多少。最后求Q次询问最小生成树的平均值。 N=10000思路:转载 2015-03-15 22:38:39 · 377 阅读 · 0 评论 -
网络流图形简化
参考对图的简化规则:规律 1. 如果几个节点的流量的来源完全相同,则可以把它们合并成一个。规律 2. 如果几个节点的流量的去向完全相同,则可以把它们合并成一个。规律 3. 如果从点 u 到点 v 有一条容量为 +∞ 的边,并且 u 是 v 的唯一流量来源,或者 v 是 u 的唯一流量去向,则可以把 u 和 v 合并成一个节点。专门说构图的一篇文章:http://wenku.baid转载 2015-03-06 12:15:31 · 494 阅读 · 0 评论 -
HDU 2962 Trucking 二分+最短路(带限制最短路)\\不满足递推关系,不能直接是spfa
题意:给定无向图,每条路有距离,和最大高度,问在高度最大的情况下,距离最小值思路:二分高度h,求最短路,下面说一下我怎么错的:刚开始,spfa更新写的是:对于每个节点,保存最大高度,和最短路 1.如果高度可以更大,更新最大高度,更新最短路 2.如果高度一样大,更新最短路,错的原因:用一个点在最大高度的情况下的最短路,去更新其他节点原创 2015-03-23 15:40:47 · 373 阅读 · 0 评论 -
HDU 3081 Marriage Match II [二分最大流]+并查集?807★
题意:给定二分图:问最多有多少种完美匹配,限制条件是,每个人对应的另一个人,在所有的完美匹配中,都不一样;思路:二分匹配数n,对X集的每个人与s连一条容量为n的边,对Y集的每个人与t连一条容量为n的边,求最大流,如果所有与s,t连接的边都满流,则n可行:为什么满流就可行,就是说是不是一定能找到n种完美匹配,以下都是个人猜想的:(一).如果X,Y集人数刚好为n,也就是说这个图是完全图,那原创 2015-03-23 15:38:18 · 524 阅读 · 0 评论 -
网络流
dinic//HDU 3549int dis[N],vis[N],clock;int st,ed;queue qq;int bfs(){ clock++; qq.push(st);vis[st]=clock;dis[st]=0; while(!qq.empty()){ int u=qq.front();qq.pop(); for(原创 2016-11-04 13:50:50 · 169 阅读 · 0 评论 -
斯坦纳生成树
dp版#include#include#include#include#includeusing namespace std;const int N=100;const int M=2000+10;const int INF=1e8;int dp[N][1<<10],s[N];int dis[N][N];int n,m,k;void floyd(){ for(i原创 2016-11-04 13:49:42 · 678 阅读 · 1 评论 -
最小树形图
//hdu 4009int in[N],pre[N];int rt,n,total;int vis[N],id[N];int mtree(){ int ans=0; while(1){ memset(in,0x3f,sizeof(in)); for(int i=0;i<total;i++){ int u=e[i].u原创 2016-11-04 13:48:08 · 188 阅读 · 0 评论 -
k度限制最小生成树
//poj 1639int g[N][N];int clo[N],dis[N],pre[N];int n,rt;int prim(int s,int id){ dis[s]=0; int ans=0; while(1){ int idx=-1,tmp=INF; for(int i=0;i<n;i++)if(!clo[i]&&dis[i原创 2016-11-04 13:47:36 · 606 阅读 · 0 评论 -
稳定婚姻
#include#include#include#include#include#include#includeusing namespace std;const int N=510;#define pb push_backvector vvb[N];int matchb[N],id[N];int rk[N][N],matchg[N];int sta[N],top;v原创 2016-11-04 13:46:51 · 288 阅读 · 0 评论 -
二分图多重匹配
//hdu2255#include#includeusing namespace std;const int N=100;const int M=100;struct Edge { int v,next; Edge(int v=-1,int next=-1):v(v),next(next){}}e[M];int head[N],total;void init(){原创 2016-11-04 13:45:58 · 197 阅读 · 0 评论 -
二分图最大权匹配算法
//HDU 1533#include#include#includeusing namespace std;const int N=100;const int M=100;const int INF=1e8;int mp[N][N];int vx[N],vy[N];int lx[N],ly[N];int slack[N];int match[N];int n;int d原创 2016-11-04 13:45:07 · 211 阅读 · 0 评论