网上摘的一些知识点基础知识 欧拉回路是图G中的一个回路,经过每条边有且仅一次,称该回路为欧拉回路。具有欧拉回路的图称为欧拉图,简称E图。 无向图中存在欧拉回路的条件:每个点的度数均为偶数。 有向图中存在欧拉回路的条件:每个点的入度=出度。 欧拉路径比欧拉回路要求少一点: 无向图中存在欧拉路径的条件:每个点的度数均为偶数或者有且仅有2个度数为奇数的点。 有向图中存在欧拉路径的条件:除了2个点外,其余的点入度=出度,且在这2个点中,一个点的入度比出度大1,另一个出度比入度大1。 欧拉路径的输出:经典的套圈算法。 下面来重点讲讲混合图的欧拉回路问题。 混合图就是边集中有有向边和无向边同时存在。这时候 Read More
两种做法1:本来想的是枚举每个点u,从s搜到u,再从t搜到u,如果两条路径只有u这一个公共点,则u可以在简单路径上,后来举出了一个反例就推翻掉了,囧。。。。。。但现在发现这个想法是下一个想法的铺垫。模型是:是否存在s->u的一条路径与t->u的另一条路径只有u这一个交点单纯的搜索很难弄,比如广搜,搜到的路径都是最短路径,很容易就可以举出反例推翻掉。举个例子:先发一张比较挫的图片这个例子中,每个点都可以成为s->t的简单路径上的点,所以答案是0.如果用搜索,很可能s->y->v->u t->v->u,而忽略了s->y->x->u导 Read More
题目要求至少添加几条边才能使去掉人和一条边后,图还是连通的首先进行双连通缩点,一个连通块就相当于新图中的一个点新的图形成了一棵树要想添加若干条边后任意去掉一条原图中的边后图还是连通的,我们应该将叶子连起来,使得任何一个叶子都有连接到别的叶子的边很显然,叶子总数cnt为偶数时,答案为cnt/2;叶子总数为奇数时,答案为(cnt+!)/2;View Code #include<stdio.h>#include<queue>#include<string.h>#include<vector>using namespace std;const int m Read More
同poj 3342http://www.cnblogs.com/wuyiqi/archive/2012/03/08/2385680.htmlView Code #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#include<string>#include<map>using namespace std;#define max(a,b) a>b?a:bconst int maxn = Read More
假设最长链是s-t,任意从一个点开始搜索,能搜到的最远的点肯定是s、t中的一个,然后再从搜到的最远点搜一遍,从这个店到能搜到的最远的点的路径就是最长链详细证明改天再写View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;int head[maxn];struct Edge{ int v,w,next;}edge[maxn*2];bool vis[maxn];int dis[maxn];int n,m;i Read More
http://www.cppblog.com/menjitianya/archive/2011/04/06/143506.html关键是如何求最少的交换次数,用到了简单哈希#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long lld;#define lowbit(x) (x&-x)const int maxn = 100010;int c[maxn],hash[maxn],val[maxn],a[maxn];void upda Read More
http://www.lightoj.com/volume_showproblem.php?problem=1166从后往前贪心,把i位置上的数放到i位置上(对不起,我只知道AC)View Code #include<stdio.h>#include<iostream>using namespace std;int a[110];int main(){ int t,n,i,j,cases=1; scanf("%d",&t); for(cases=1;cases<=t;cases++) { int tot=0; scanf("% Read More
DP过程注意:对于每个矛盾关系,从老板向员工连一条边dp[i][0]表示不取i的最大值,可以由两个状态转移而来dp[i][0]+=sigma[ max(dp[j][0],dp[j][1])],j为儿子,即儿子取或不取都可以dp[i][1]表示取i的最大值,初始值赋为1,那么儿子节点就不能取了,所以dp[i][1]=sigma(dp[j][0]);判断方案是否唯一观察状态转移的过程可知:dp[i][0]是由dp[j][0],dp[j][1]两个状态过来的,所以当dp[j][0]==dp[j][1]时,方案不唯一,即子节点选与不选都可以但是注意前提是dp[i][0]更优与dp[i][1],即i这个 Read More
先用两个dfs暴力求出所有的lucky numbers,然后二分lucky number数组的下标,求出答案View Code #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>using namespace std;typedef __int64 lld;vector<lld> lu,res;int tot;void dfs(lld num,int de){ if(de==12) return ; l Read More
好猛的一道题目,做到吐血,最后发现有一组数据栈溢出了,就一组!!!算了,想法还是最重要的参考这里,可以和我的文章结合起来看http://www.cppblog.com/Yuan/archive/2010/09/06/125962.html?opt=admin首先明确一点,由于是两点之间的一条路径,所以不可能出现下面的情况即不可能出现三叉路口,出现三叉的就不是两点间的路径了所以只能是下面两种情况1、 以u为根时,路径分布在u的两棵子树中,一棵子树中的长度为a,另一棵为b=L-2-a,(图中红色的路径部分除外)2、 只延伸出一条路径到一棵子树中所以在v这棵子树中有L-1长度的路径存在。我们先假设整 Read More