
图论
文章平均质量分 73
Benzema67
北京邮电大学学生
展开
-
UVALive - 6151
n遍bfs,每一遍dfs求出包含某一顶点的所有环,这个dfs做不到,我卡了好久。#include #include #include #include #define N 510#define M 20100using namespace std;int n,m;struct Edge{ int v,next;}edge[M*2];int head[N],cnt;原创 2013-10-23 20:19:55 · 1037 阅读 · 0 评论 -
HDU 4421
2012长春现场赛的题正解要枚举32个bit,每次做2sat判断是否矛盾#include #include #include #define N 510#define NN 1010#define M 3000100using namespace std;int n,b[N][N];int head[NN],cnt,scc,top,Index;int dfn[NN],l原创 2013-03-19 23:47:18 · 1525 阅读 · 0 评论 -
HDU 3681 Prison Break 哈密顿回路DP
题意是已知一幅矩阵迷宫,給起点,开始时充满电,要求是遍历给定的点,每移动一次花费1,迷宫中有若干充电池可充满电(每个充电池只能用一次),求原始电量最少是多少*/首先抽象出起点、终点、充电池,建立他们的最短路径图,二分枚举原始电量 从而转化为 哈密尔顿回路的状态DP问题 。这样建图原理是:对于原图当前用不用充电池 在新图中 我们可以用两种不同的边来表示(在新图中通过一条边移动到一个充电池则一原创 2013-02-28 14:51:53 · 1486 阅读 · 0 评论 -
POJ 3275
FLOYD的邻接表形式这个题目费解的地方时问题是换需要再调查多少对关系等于C(N, 2) - K(N是点数,K是已清楚的关系对)#include#include#include#include#include#include#define N 1010#define M 10100typedef long long ll;using namespace std;str原创 2013-02-18 19:27:38 · 1012 阅读 · 0 评论 -
HDU 3686
双连通求割点,缩点成树,求LCA。题目意思是求一条路到另一条路所要经过的最小割点数,先求点的双连通分量,然后把一个双连通分量(不包括割点)看成一个点,所以这个连通分量的所有边都是这个连通分量的标号,然后把每个割点也看成一个点(定义一个编号),构图;然后求出两条路径编号之间的最短距离/2即是答案原创 2012-10-22 21:02:23 · 1119 阅读 · 0 评论 -
POJ 4046
简单最短路不过这个蛋疼的题意啊,我以为是求起点到最贵的点的距离+最贵点权,原来还要+最贵点到终点的距离,坑爹啊!!思路是枚举n个点依次做最贵的点跑SPFA不过这题卡常数。#include#include#include#include#include#define N 1010#define M 20010#define inf ((~(0ULL))>>1)us原创 2012-10-20 17:01:29 · 1183 阅读 · 2 评论 -
【OI杂记】求二叉树上任意两点的最短路径上的边权最大值
给出一棵树,每条边有一边权。对于任意给定的两点,求,此两点的最短路径上,边权的最大值。 对于下图:蓝圈中任意一点与红圈中任意一点的路径上的最大边必定是8。 根据这个现象,可以把上述的树重建成如下图所示。新图的叶子结点为原图的所有结点,内部结点为原图的边权,建边顺序又下小到大。如图所示:新图的红色编号为原图的结点编号,蓝色编号为原图转载 2012-10-16 22:52:10 · 3555 阅读 · 2 评论 -
HDU 4118 && ZOJ 3659
两道有趣的树上乱搞题HDU 4118#include#include#include#define N 100100using namespace std;struct Edge{ int v,c,next;}edge[N*2];int head[N],num[N],cnt,n;long long sum;bool vis[N];void addedge原创 2012-10-16 20:43:54 · 1252 阅读 · 0 评论 -
ZOJ 3396
斯坦那树有一个结论:n个点的斯坦那树至少会经过n-2个中间节点,这里n=3,所以至少会经过一个中间节点,求出这三个点的单源最短路后枚举中间节点即可。要注意虽然枚举有一些点时,并不是简单的三个dist相加,但最小的一定是三个相加#include#include#include#include#define N 510#define inf 6000000using names原创 2012-10-16 22:45:58 · 813 阅读 · 0 评论 -
POJ 3728
倍增法DP#include#include#include#define N 50100#define POW 17#define inf 1000000using namespace std;int val[N];int head[N],cnt;int p[N][POW],dep[N],mi[N][POW],mx[N][POW],dp[N][POW],dp1[N][POW]原创 2012-10-16 19:21:48 · 1422 阅读 · 0 评论 -
ZOJ 3649
倍增法DP#include#include#include#define N 50100#define POW 17#define inf 1000000using namespace std;int val[N];int head[N],cnt;int p[N][POW],dep[N],mi[N][POW],mx[N][POW],dp[N][POW],dp1[N][PO原创 2012-10-16 19:15:37 · 888 阅读 · 0 评论 -
light oj 1128
倍增法LCA + DP#include#include#includeusing namespace std;const int N = 100010;int val[N];int p[N][18];int main(){ int t,T,n,q,i,j; int num,v; scanf("%d",&T); for(t=1;t<=T;t++){ sca原创 2012-10-14 22:05:16 · 1106 阅读 · 0 评论 -
倍增求LCA的模板
/*2^17=131072;2^18=262144;*/const int POW = 18;void dfs(int u,int fa){ d[u]=d[fa]+1; p[u][0]=fa; for(int i=1;i<POW;i++) p[u][i]=p[p[u][i-1]][i-1]; int sz=edge[u].size(); for(int i=0;i<sz;原创 2012-10-14 20:54:34 · 4465 阅读 · 0 评论 -
POJ 2949
DFS的SPFA用于判负环#include#include#define N 200100using namespace std;int n;int vis[900],k;int head[N],cnt;double dis[N],mid;bool is[N];int flag;struct Edge{ int v,w,next;}edge[N];void in原创 2012-10-13 22:16:07 · 1393 阅读 · 0 评论 -
hdu 4115
简单2-sat方法一:找到矛盾项(选x不能选y)若c == 0{ //第u次与第v次相同 if(a[u] != a[v]) g[u].push_back(v+n),g[v].push_back(u+n); if(a[u] != b[v]) g[u].push_back(v),g[v+n].push_back(u+n);原创 2012-10-04 00:21:45 · 1724 阅读 · 5 评论 -
BOJ 1452
k元环问题,即邻接矩阵的k次幂用矩阵快速幂加速#include #include #include #define N 110#define inf -1000000000using namespace std;int n,m;struct Matrix{ int d[N][N];};Matrix multiply(Matrix a,Matrix b){ M原创 2013-03-25 19:33:47 · 812 阅读 · 0 评论 -
UVALive5796点双联通分量or边双联通分量
两种方法都可以。#include #include #include #include #include #define N 10010#define M 100100#define Q 1010using namespace std;struct Edge{ int v,next;}edge[M*2 + N*4];int head[N],cnt;int dfn原创 2013-10-20 20:05:48 · 1278 阅读 · 0 评论 -
HDU 4757
可持久化trie树。不会可持久化数据结构的话推荐先看陈立杰的论文。先掌握可持久化线段树和可持久化trie树。原创 2013-10-13 19:02:10 · 2333 阅读 · 0 评论 -
HDU 4756 && HDU 4126
两个题次小生成树的扩展题。先prim求出最小生成树,枚举删除每条树边后求分割成的两部分之间的最小连接费用,这一步用一个O(n^2)的n遍dfs求解。不过HDU 4756这个题我被sqrt函数卡死,之前的写法HDU被卡爆栈,給sqrt传负数爆栈//double tmp=(double)(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); dis[i][j]=dis[j][i]=sqrt(tmp);原创 2013-10-04 18:23:50 · 1827 阅读 · 1 评论 -
URAL 1806
这道题不难,但是map里的一个操作也卡了我MLE我之前用map去查询的时候这么写t1=mp[tem];这样不好的是如果tem不存在,会自动插入map一组值,导致内存消耗巨大。。。。改成传统查询方法就可以了。言归正传,说说这道题,首先n^2的建图是必然T的,然后就不会了,后来队友提醒,连边的条件給的很强,只能有一个位置不同或者有两个位置不同但交换后便相同,这样一个点的可能连边数是10原创 2013-04-18 12:55:50 · 1207 阅读 · 0 评论 -
CF 208E
倍增求LCA模板#include#include#include#include#define N 100100using namespace std;vectorvec,vec1[N];int head[N],cnt;struct Edge{ int v,next;}edge[N];int tim,b[N],f[N],dep[N],p[N][18];int an原创 2012-10-14 20:45:59 · 1064 阅读 · 0 评论 -
UVALive - 6039
想法题,只需要分析一个点及其直接连通的边即可,维护一个vtot记录总和,vmax记录最大的边权,如果vmax>=vtot-2,那么一共有vmax个自行车。否则,如果vsum是偶数,剩下的边一定会匹配,如果vsum是奇数,除去一条边,剩下的一定会匹配。#include #include #include #include #include #define N 100100us原创 2013-05-10 17:24:53 · 1120 阅读 · 0 评论 -
对差分约束问题的理解
首先讨论这种标准形式的问题X1 - X2 X1 - X5 X2 - X5 X3 - X1 X4 - X1 X4 - X3 X5 - X3 X5 - X4 上面的不等式组全都是两个未知数的差小于等于某个常数(大于等于也可以,左右乘以-1就可以化成小于等于)。这样的不等式组就称作差分约束系统。解法利用到了单源最短路径问题中的三角形不等式。即对于任何一条边u原创 2013-05-07 15:45:01 · 1019 阅读 · 0 评论 -
点双联通
模板#include #include #include #include #include #define N 2000 //注意缩点后新建的图的顶点数可能达到2*n-1#define M 600000 //缩点新建的图一定是树using namespace std;struct Edge{ int u,v,id,next;}edge[M*2];int原创 2013-05-07 16:28:19 · 999 阅读 · 0 评论 -
最短路--差分约束系统
看了一晚上头都大了。。。以前学的时候不是太懂加上好久没做就更不懂了http://imlazy.ycool.com/post.1702305.htmlhttp://hi.baidu.com/accplaystation/item/72c9e50dd1eb63e3f45ba6ff看了这两篇篇文章后有些微懂总结下来就是这么个结论:如果做后是取最值求最大值,把不原创 2012-09-21 21:26:00 · 761 阅读 · 0 评论 -
spoj segment
差分约束 离散化端点之后把端点和相邻端点之间的线段当作新图的顶点提供一组样例,wa的估计都wa这了input51 2 11 3 02 4 03 5 04 5 0output1#include#include#include#include#define N 410using namespace std;int num[N*4原创 2012-10-06 20:32:34 · 692 阅读 · 0 评论 -
POJ 3694
tarjan求双联通(含重边)+ LCA定义求法#include#include#include#define N 100100#define M 200100using namespace std;int head[N],cnt,num,depth;int dfn[N],low[N],fa[N],Dfn[N];bool yes[N];struct Edge{ i原创 2012-10-11 19:21:03 · 1197 阅读 · 0 评论 -
UVALive 6206
这是个图论问题做法是首先缩点,环内的边的删除不会影响连通性,缩点得到一棵树,然后dfs计算树边的新权值,接下来二分搜索最大话费,在dfs贪心判断是否可行即可。总之这道题是个大综合题。。。#include #include #include #include #include #include #include #include #define N 10100#define原创 2013-04-15 00:38:05 · 1142 阅读 · 0 评论 -
SPFA几道经典题目
HDU 4360#include #include #include #include #include #include #include #include #include #define eps 1e-5#define MAXN 2222#define MAXM 95555#define INF 200000000000000LLusing namespace原创 2013-04-12 14:45:09 · 1288 阅读 · 0 评论 -
HDU 4005
边双联通分量(有重边)+树上DP#include#include#include#include#define N 20100#define M 200100#define inf 100000000#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;int head1[N],h原创 2012-10-12 18:43:00 · 1304 阅读 · 0 评论 -
POJ 3417
树形DP+LCA#include#include#include#define N 100100using namespace std;int head1[N],head2[N],cnt,num;int dp[N],f[N];bool flag[N];struct Edge{ int v,next;}edge[N*4];void addedge(int u,int原创 2012-10-11 20:18:48 · 1405 阅读 · 0 评论 -
hdu 3655
SPFA求1,2,3,这三个点的单源最短路然后枚举每个点做meeting point ,遍历这个点的临接边,然后判断这个边是否是(1,2,3)中的至少2个点的最短路上的边即可。#include#include#include#include#define N 3010#define M 200010#define inf 200000000typedef long long原创 2012-09-06 18:01:55 · 929 阅读 · 0 评论 -
HDU 4396 || HDU 4360
今天SPFA写跪了,怎么弄都T赛后总结写搓了。。。#include#include#include#define M 100100#define N 5010#define inf 100000000using namespace std;typedef long long ll;int n,m,cnt;int s,t,ts;struct Edge{ int原创 2012-08-23 19:42:11 · 1359 阅读 · 0 评论 -
POJ 1635
用树的最小表示#include#include#include#includeusing namespace std;string a;char tem[3010];string dfs(int i){ vectorv; int n=a.size(); while(i<n && a[i]!='1'){ v.push_back('0'+dfs(i+1)); i+=v.原创 2012-08-19 01:15:51 · 1227 阅读 · 0 评论 -
HDU 4340
树形DP看了这篇文章才懂http://blog.youkuaiyun.com/cyberzhg/article/details/7840922#include#include#include#define inf 10000000using namespace std;int c[110][2];int head[110],cnt;int dp[110][2][2];原创 2012-08-08 17:48:37 · 1123 阅读 · 1 评论 -
POJ 3177
这个题有点问题输入有重边,要先去重,重边算一条边求边双连通和强联通算法一样。#include#include#include#include#include#define N 5010#define M 10100using namespace std;struct edge{ int u,v,next;}edge[M*2];int n,m;int cnt,he原创 2012-08-06 16:13:59 · 1081 阅读 · 0 评论 -
POJ 1985 && BOJ 196 && HDU 2196
树型DP维护从有根树的顶点出发到叶子的最长距离和次长距离(要保证通过不同的孩子)POJ 1985#include#include#include#includeusing namespace std;int head[40010],cnt;int dp1[40010],dp2[40010];int ans=0;struct Edge{ int v,c,next;}原创 2012-08-04 00:41:14 · 1455 阅读 · 0 评论 -
BOJ 292 MABODX
MABODX Accept:17 Submit:88Time Limit:4000MS Memory Limit:65536KBDescriptionThere is a country which has N city. Because The king spend littlemoney on the road ,so原创 2012-02-23 21:56:47 · 696 阅读 · 0 评论 -
[SCOI2005]王室联邦
Description“余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理。他的国家有n个城市,编号为1..n。一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路。为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个城市。每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但原创 2012-03-09 19:41:52 · 1810 阅读 · 0 评论 -
HDU 4001 To Miss Our Children Time
一开始我一直想的是简单图论问题,构图SPFA求最长路,发现这样做有环不好处理。比如这组样例:21 1 1 01 1 1 0构图就会有环,不能直接SPFA,tarjan缩点的话应该可以做,但是代码量就太大了。可以这样去处理:bool cmp(block a,block b) { if(a.x!=b.x)return a.x if(a.y!=b原创 2012-03-24 21:38:20 · 947 阅读 · 0 评论