
图论
zhonghp
善良的华平~
展开
-
割点
首先请看割点的定义:如果在连通的无向图中去掉某点u后,使得图中联通块增加,则称u为改无向图的割点。关键步骤如下: 1、判断图的连通性,可以直接通过深度搜索或者是并查集的方法。如果保存的是点的信息,使用深度搜索的方法: memset(vis, false, sizeof(vis)); dfs(1); bool flag = false; for(int i = 1; i 如果保存的是边的信息,使用深度搜索的方法:const int maxn = 110;int u[maxn*m原创 2011-04-04 10:40:00 · 557 阅读 · 0 评论 -
HDu1232 畅通工程
<br />一道很好的并查集题目。。。<br /> <br />#include<stdio.h>#include<string.h>#include<set>using namespace std;const int maxn = 1010;int fa[maxn];int find(int x){ return fa[x] == x ? x : (fa[x] = find(fa[x]));}#define LOCALint main(){#ifde原创 2011-05-06 20:00:00 · 551 阅读 · 0 评论 -
HDu 1285 确定比赛名次
<br />比较水的一道拓扑排序题。<br />由于题目对输出结果的顺序有了要求:要求是最小字典序的答案,所以用bfs版本的拓扑排序算法比较容易实现。<br />#include<stdio.h>#include<string.h>const int maxn = 510;int g[maxn][maxn], in[maxn], topo[maxn];bool vis[maxn];int n, m, len;void read_graph(){ memset(g, 0,原创 2011-05-06 10:46:00 · 519 阅读 · 0 评论 -
ZOJ 3332 Strange Country II
<br />原本自己用dfs水过了这题,但后来看了别人的题解后发现,原来这题还大有名堂:竞赛图。<br />竞赛图就是任意两点之间有且仅有一条有向边的图, 可以证明竞赛图一定存在哈密尔顿道路。<br />证明如下:<br />假设节点V0....Vk存在哈密尔顿道路,则添加节点Vk+1时有以下三种情况:<br />(1)Vk+1到V0存在有向边,则把Vk+1插到V0的前面,此时仍存在哈密尔顿道路<br />(2)Vk到Vk+1存在有向边,则把Vk+1放到Vk的后面,此时仍存在哈密尔顿道路<br />(3)如原创 2011-04-21 00:39:00 · 1076 阅读 · 0 评论 -
PC/UVa 111003/10278 Fire Station
<br />这题就是一个多源的最短路径问题:<br /> <br />先计算出当前已经放好的消防站所对应的各个房子到消防站的最短距离,<br />然后枚举新的一个消防站应该排放的位置,然后选择这些位置中的最优解。<br /> <br />在这里就用了比较简单的Dijkstra水过~<br />#include<stdio.h>#include<string.h>#include<limits.h>const int maxn = 510;int g[maxn][maxn];int f原创 2011-04-20 02:30:00 · 1282 阅读 · 0 评论 -
PC/UVa 111002/10054 The Necklace
这题就是无向图的欧拉回路问题,要注意的是:(1)图要是连通的,(2)欧拉回路/欧拉路径的输出#include#includeconst int maxn = 51;int g[maxn][maxn];bool vis[maxn];bool app[maxn];int deg[maxn];int n;void dfs(int cur){ for(int i = 1; i原创 2011-04-20 00:22:00 · 909 阅读 · 0 评论 -
PC/UVa 110903/10099 The Tourist Guide & UVa 10048 Audiophobia
<br />一开始用深搜去做这道题,可能是剪枝没有写好吧, 超时了。后来看了一下别人的题解,发现可以用动态规划来做,其想法和floyd算法的动态规划想法差不多,而这里的问题则转变为:找出任意两点之间最小权边的最大路径。<br /> <br />这题还有一个地方需要注意的是:在计算每条路乘客数量的上限时,司机也应该要算进去的!!!<br />#include<stdio.h>#include<string.h>#include<limits.h>#include<algorithm>using原创 2011-04-06 14:17:00 · 663 阅读 · 0 评论 -
PC/UVa 110902/10067 Playing With Wheels
<br />本题的题目意思比较清晰:有4个齿轮,每一次可以向左或者向右转动一个齿轮,求两个数是否可到达,如果可以,则输出最短步骤数。<br />由此可见应该用bfs解决。<br />#include<stdio.h>#include<string.h>#include<queue>using namespace std;const int maxn = 10;int s, t;int f[4];bool vis[10010];void setVisited(){ vi原创 2011-04-06 01:07:00 · 943 阅读 · 0 评论 -
PC/UVa 110905/10029 Edit Step Ladders
这题比较容易想到的方法就是枚举:对于每一个当前输入的字符串(第一个除外),枚举其前面且满足条件的字符串,取其中步数最长的。经过简单的分析可知:算法复杂度高达O(N*N),由于N的取值可以去到25000,所以这种方法显然会超时,所以要找其他方法。参考别人写的题解后,我使用了二分法的思想来完成本题。其实题目的二分法思想也挺明显的!!输入数据是按照字符串的字典序顺序出现的,而对于每一个当前输入的字符串(第一个除外),枚举其所有变化后会产生的字符串,并利用二分法在之前已经输入的字符串中找出步数最长的一个。如果搞懂了原创 2011-04-07 01:31:00 · 989 阅读 · 0 评论 -
PC/UVa 110901/10004 Bicoloring
<br />由于题目对输入的图给了比较严格的规定:总是连通的,无向的,无自环的。所以使用简单的dfs可以水过~<br />#include<stdio.h>#include<string.h>#include<vector>using namespace std;const int maxn = 210;vector<int> g[maxn];int color[maxn];int n, m;bool dfs(int cur){ for(int i = 0; i <原创 2011-04-06 01:04:00 · 565 阅读 · 0 评论 -
HDu1233 还是畅通工程
<br />比较水的一道最小生成树题目,直接用Kruskal算法水过~<br /> <br />#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn = 110;const int maxm = maxn*maxn/2;int u[maxm], v[maxm], w[maxm], r[maxm];int p[maxn];int n, m;int原创 2011-05-06 20:10:00 · 450 阅读 · 0 评论