摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1269View Code 1 void tarjan(int x) 2 { 3 int i, a; 4 low[x] = dfn[x] = index; // 刚搜到一个节点时low = dfn 5 index++; 6 stack[++head] = x; // 将该节点入栈 7 instack[x] = 1; // 将入栈标记设置为1 8 for(i = 1; i <= n; i++) // 遍历入栈节点的边 9 { 10 ... 阅读全文
posted @ 2013-03-09 16:29 另Ⅰ中Feel▂ 阅读(336) 评论(0) 推荐(0) 编辑
摘要: [有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,两者的时间复杂度都是O(N+M)。本文介绍的是Tarjan算 阅读全文
posted @ 2013-03-09 16:27 另Ⅰ中Feel▂ 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 匈牙利算法求二分图的最大匹配最大匹配:图中包含边数最多的匹配称为图的最大匹配。二分图的最大匹配有两种求法,第一种是最大流;第二种就是匈牙利算法。最大流算法的核心问题就是找增广路径(augmentpath)。匈牙利算法也不例外,它的基本模式就是:初始时最大匹配为空while找得到增广路径do把增广路径加入到最大匹配中去可见和最大流算法是一样的。但是这里的增广路径就有它一定的特殊性,下面我来分析一下。(注:匈牙利算法虽然根本上是最大流算法,但是它不需要建网络模型,所以图中不再需要源点和汇点,仅仅是一个二分图。每条边也不需要有方向。)图1是给出的二分图中的一个匹配:[1,5]和[2,6]。图2就是在 阅读全文
posted @ 2013-01-23 17:50 另Ⅰ中Feel▂ 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 二分图最优匹配:对于二分图的每条边都有一个权(非负),要求一种完备匹配方案,使得所有匹配边的权和最大,记做最优完备匹配。(特殊的,当所有边的权为1时,就是最大完备匹配问题)解二分图最优匹配问题可用穷举的方法,但穷举的效率=n!,所以我们需要更加优秀的算法。先说一个定理:设M是一个带权完全二分图G的一个完备匹配,给每个顶点一个可行顶标(第i个x顶点的可行标用lx[i]表示,第j个y顶点的可行标用ly[j]表示),如果对所有的边(i,j)inG,都有lx[i]+ly[j]>=w[i,j]成立(w[i,j]表示边的权),且对所有的边(i,j)inM,都有lx[i]+ly[j]=w[i,j]成立 阅读全文
posted @ 2013-01-23 17:49 另Ⅰ中Feel▂ 阅读(2515) 评论(0) 推荐(0) 编辑
摘要: 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1711KMP#include<iostream>#include<string>using namespace std;const int Max_n=1000010;const int Max_m=10010;int a[Max_n];int b[Max_m];int n, m;//void get_nextval(const char *T, int next[]) //字符数组用这个void get_nextval(const int *T, int next[]) 阅读全文
posted @ 2013-01-19 14:06 另Ⅰ中Feel▂ 阅读(139) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1075/* 字典树(trie tree) 它使在字符串集合中查找某个字符串的操作的复杂度降到最大只需O(n),其中n为字符串的长度。 trie是典型的将时间置换为空间的算法。 trie的原理是利用字符串集合中字符串的公共前缀来降低时间开销以达到提高效率的目的。 它具有以下性质: 1,根结点不包含任何字符信息; 2,如果字符的种数为n,则每个结点的出度为n(这样必然会导致浪费很多空间,这也是trie的缺点); 3,查找,插入复杂度为O(n),n为字符串长度。 题目描... 阅读全文
posted @ 2012-12-05 18:25 另Ⅰ中Feel▂ 阅读(152) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1426#include<iostream>#include<string>using namespace std;const int maxn = 12;int map[maxn][maxn];bool row_used[maxn][maxn];//所在行bool low_used[maxn][maxn];//所在列//int xy_used[maxn][maxn];int flag;struct Node{ bool a[10];}xy_used[4][4];void Make_se 阅读全文
posted @ 2012-09-13 11:01 另Ⅰ中Feel▂ 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 题目传送门 :http://acm.hdu.edu.cn/showproblem.php?pid=3789题意: 给国家的奖牌榜排名,有四钟排序方式:排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 。输出要求排序国家的最佳排名,比如a国家的四种排名方式的结果是:1 2 3 4,那么应该输出1:1,表示用的是第一种排序,名次为1。还有几是并列排名问题,如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4。题目种并不是要让你对所以的国家进行排序,他会给出让你排序的国家号,只需对这些国家进行排序即可,刚开始就是这里没理解好wa了好几次,我们只需要把这些需要排序的国. 阅读全文
posted @ 2012-09-09 11:13 另Ⅰ中Feel▂ 阅读(504) 评论(0) 推荐(0) 编辑
摘要: View Code 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 const int maxn = 10000+10; 6 vector<int>map[maxn]; 7 int save[maxn]; 8 int index[maxn]; //入度 9 __int64 value[maxn]; 10 bool used[maxn]; 11 int n, m; 12 int flag; 13 __int64 sum = 0; 14 15 //初始化 16 void ini 阅读全文
posted @ 2012-09-09 11:00 另Ⅰ中Feel▂ 阅读(526) 评论(0) 推荐(0) 编辑
摘要: 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 const int maxn = 500+10; 6 vector<int>map[maxn]; 7 int save[maxn]; 8 int index[maxn]; 9 bool used[maxn];10 int n, m;11 int flag;12 13 //初始化14 void init()15 {16 for(int i=0; i<=n; i++)17 {18 map[i].clear();19 }20. 阅读全文
posted @ 2012-09-08 10:45 另Ⅰ中Feel▂ 阅读(155) 评论(0) 推荐(0) 编辑