随笔分类 -  图论问题

sicily 2377 Ants Colony 【LCA Tarjan算法】
摘要:周赛第二次的题目。传说中的最近公共祖先问题(LCA),用Tarjan算法可以过,但注意结果超int. 从题意可以看出这些colony之间构成了一棵树的关系,用Tarjan算法找出每对查询的顶点u,v的公共祖先ancestor,则u,v之间的距离就是dist[u]+dist[v]-2*dist[ancestor],关系显而易见,会者不难。View Code #include <iostream>#include <stdio.h>#include <vector>using namespace std;const int MAX = 100001;struct 阅读全文
posted @ 2011-04-20 00:23 c++fans 阅读(359) 评论(0) 推荐(0)
sicily 1801 Reading books【DFS】
摘要:根据关系构图:相似的两本书之间有一条双向边。然后利用dfs找出每个连通块,除了这个连通块中耗时最小的一本书要用原来的时间读完,其他的书只要一半时间就可以读完,直到全部连通块处理完便可找到答案。 搜索永远是那么得迷人。。。。View Code #include <iostream>#include <cstring>#include <vector>using namespace std;const int MAX = 105;vector<int> vec[MAX];int n,m,tim[MAX],_min,temp[MAX],len,root 阅读全文
posted @ 2011-03-30 17:06 c++fans 阅读(289) 评论(1) 推荐(0)
HDU 1878 【欧拉回路】
摘要:掌握无向图欧拉回路存在的充要条件:连通且所有点的度数为偶数。这里采用并查集判断是否连通,只要把每条边的两个顶点合并,最后判断是否有顶点不在这个集合里就可知是否连通。在并查集合并时没有判断要合并的顶点是否已经在一个集合中,导致产生集聚,多次TLE,自己真的很水啊。View Code #include <iostream>#include <cstring>using namespace std;const int MAX = 1005;int n,m,degree[MAX],root[MAX];void makeSet(){ for(int i = 1;i <= n 阅读全文
posted @ 2011-03-26 09:22 c++fans 阅读(633) 评论(0) 推荐(0)
sicily 1083 Network【最小生成树】
摘要:最小生成树的水题,直接上代码了。View Code // source code of submission 689439, Zhongshan University Online Judge System#include <iostream>#include <vector>#include <algorithm>using namespace std;struct Edge{ int u,v,length; Edge(int uu,int vv,int ll): u(uu),v(vv),length(ll) {}};vector<Edge> 阅读全文
posted @ 2011-03-24 22:46 c++fans 阅读(583) 评论(0) 推荐(0)
sicily 11192. Guardian of Decency(二分匹配)
摘要:题意是老师要带学生出游,但有怕学生会成为一对。给出学生们不会成为一对的条件:1身高相差超过402性别相同3音乐风格不一样4最喜欢的运动一样然后给出每个学生的资料,问能带多少学生出去,使得这些学生不会成为一对。构图时先求出会成为一对的对数ans,然后总数n-ans/2就是答案。#include <iostream>#include <cstring>#include <string>using namespace std;const int MAX = 505;struct student{ int h; char sex; string style,spor 阅读全文
posted @ 2011-03-16 10:29 c++fans 阅读(225) 评论(0) 推荐(0)
hdu 1045Fire Net(DFS or 二分匹配)
摘要:View Code //数据小,dfs+回溯,能够水过#include <iostream>#include <cstring>#include <queue>using namespace std;const int MAX = 10;char map[MAX][MAX];int n,ans;bool can(int x,int y){ int i,j; for(i = x+1;i < n;++i) { if(map[i][y] == 'Z') return false; if(map[i][y] == 'X') br 阅读全文
posted @ 2011-03-13 14:03 c++fans 阅读(198) 评论(0) 推荐(0)
PKU 2239 Selecting Courses(二分图最大匹配)
摘要:View Code 题意大概是学校有多门课。没门课可能会在一个星期的每一天i(1<=i<=7)的第j(1<=j<=12)节课进行。求一个选课方案使得能选的课最多。构造二分图,M={课程},N={课程举行的时间},然后构造M到N得二分图。这里将时间(i,j)映射为一个整数(i-1)*12+j用于构图。然后用匈牙利算法进行匹配就行了。#include <iostream>#include <cstring>using namespace std;int map[305][86],match[86],course[10][15 ];bool vis[8 阅读全文
posted @ 2011-03-05 23:55 c++fans 阅读(192) 评论(0) 推荐(0)
sicily 1303 Job Assigment(二分图最大权匹配)
摘要:View Code 工作人员集合M和工作N是二分图的两个部分,工作人员i对工作j的满意度k作为边<i,j>的权值,要求一个令所有工作人员满意度最大的匹配就是求这个二分图的带权最大匹配。这里用到KM算法,由于不是很懂KM算法,所以要感谢http://www.cnblogs.com/north_dragon/archive/2010/06/03/1750789.html这位大牛的模板。在一年中最较特殊的2月的最后一天抓住AC的机会。#include <iostream>#include <cstring>#include <cstdio>using 阅读全文
posted @ 2011-02-28 23:26 c++fans 阅读(389) 评论(0) 推荐(0)
sicily 1402Panic Room(最大流最小割)
摘要:View Code 设置超级源点s(此处标号为m的房间就是源点),如果房间k有入侵者(intruder),则存在一条有s指向k的弧,且容量为c(s,k)=INF;然后是处理由门联通的两个房间的关系了。(1)如果房间i和j有门且cp在i,则c(i,j)=INF,c(j,i)=1;(2)如果房间i和j有门且cp在j,则c(i,j)=1,c(j,i)=INF;超级汇点t就是要保护的房间号码。计算从s到t的最大流ans.若ans>=INF,说明无法保护,否则ans为需要锁上的门的最小数量。#include <iostream>#include <cstring>#incl 阅读全文
posted @ 2011-02-27 10:59 c++fans 阅读(539) 评论(0) 推荐(0)
HDU3549(Flow Problem)(网络最大流)
摘要:赤裸裸的Ford-Fulkerson算法求最大流。#include <iostream>#include <cstring>#include <queue>using namespace std;const int MAX = 1003;int map[MAX][MAX],pre[MAX],n,m,ans;bool vis[MAX];int Maxflow() // 采用BFS找增广路径{ while(true) { queue<int> que; memset(pre,0,sizeof(pre)); memset(vis,0,sizeof(vi 阅读全文
posted @ 2011-02-24 19:26 c++fans 阅读(639) 评论(0) 推荐(0)