随笔分类 - 图论
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1565思路:将横纵坐标和为偶尔染白色,其他染黑色,黑点连接源点,流量为该点的值,白点连接汇点,流量为该点的值,黑白点有相邻的就连边,值为无穷大。最后求最大流,即该图的最小割。PS:刚开始不明白为为什么最大流会等于最...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4289题目讲的是有一些恐怖分子要从S市去往D市,要求在一些城市中安排特工,保证一定能够抓住恐怖分子,因为安排特工需要一定的费用,所以希望找出最小的花费。思路:可以把每个城市,即每个点拆分成进来的点和出去的点,如x点...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3605题目很简单,要求的就是最后能搬到星球上去的人的个数。刚开始看到,知道是最大流,就把人和星球都设为点,能生存就连线,权值为1,最后建立超级源点和超级汇点。求出最大流量即可。先是RE,开大数组后TLE。仔细算了,...
阅读全文
摘要:1 #include 2 #include 3 #include 4 #define maxn 1050//表示x集合和y集合中顶点的最大个数 5 int nx,ny;//x集合和y集合中顶点的个数 6 int edge[maxn][maxn];//edge[i][j]为1表示ij可以匹配 7 i...
阅读全文
摘要:http://poj.org/problem?id=1469 1 #include 2 #include 3 #include 4 #define point_MAX 10000 5 #define edge_MAX 100000 6 using namespace std; 7 st...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1532使用网络流最大流中的DINIC算法解决 1 #include 2 #include 3 #define point_MAX 10000 4 #define edge_MAX 100000 5 #define ...
阅读全文
摘要:#include#include#define MAX 9999999int visited[10000],dis[10000],map[1010][1010];int vertex,edge;int init(){ int i,j; for(i=1;imap[x][i]+dis[x])//松弛操作,如果一个点被成功松弛了,那么它才可能松弛其他的边,否则关于它的最短路径没有改变,它到瓶颈了 { dis[i]=dis[x]+map[x][i]; if(!visited[i])//这个说明它没有在队列中 ...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1874这题坑在于会出现重边,必须保留小的那个#include#include#define MAX 9999999int map[1000][1000];int vertex,edge;void init(){ int i,j; for(i=0;iw) map[x][y]=map[y][x]=w; } floyd(); scanf("%d%d",&x,&y); if(map[x][y]>=MAX)printf("-1\n...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1869这题是简单的弗洛伊德算法的转变,在最后判定的时候是跟7进行判定,因为点与点间的路径是没用算上本身那个cost的#include#include#define MAX 9999999int map[1000][1000];int vertex,edge;void init(){ int i,j; for(i=0;i7)return 0; } return 1;}int main(){ int i,j,x,y; while(scanf("%d%d",&vertex...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1385这个是模板题目。核心算法:通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。采用的是(松弛技术),对在i和j之间的所有其他
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2063#include#include#include#define maxn 1000//表示x集合和y集合中顶点的最大个数! int nx,ny;//x集合和y集合中顶点的个数 int edge[maxn][maxn];//edge[i][j]为1表示ij可以匹配 int cx[maxn],cy[maxn];//用来记录x集合中匹配的y元素是哪个! int visited[maxn];//用来记录该顶点是否被访问过! int path(int u) { int v; for(v=0;v%d...
阅读全文
摘要:匈牙利算法是解决寻找二分图最大匹配的。(一)预备知识 什么是二分图:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。 什么是匹配:把上图想象成3男4女搞对象(无同性恋),连线代表彼此有好感,但最终只能1夫1妻,最终的配对结果连线就是一个匹配。匹配可以是空。 什么是最大匹配:在有好感的基础上,能够最多发展几对。 现在要用匈牙利算法找出最多能发展几对。[color=green][size=medi
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1068这题是模板题。题目大意:给你每个人互相认识的人,然后问最多能找到多少个人都互不认识。其实就是找:最大独立集合!已知:二分图最大独立集合 = 节点数 - 最大匹配数而:最大匹配数=最大匹配 / 2。用匈牙利算法先算出最大匹配,然后就可以解了。对于这个算法,每次找到增广路后,只需记录cy,就y集合中对应的x元素,因为每次查找都是从x开始,这样在深搜过程中就可以判断出下面,即y元素集合中是否已经被匹配了,无需cx,cy都记录。#include#include#include#define maxn 1000/
阅读全文

浙公网安备 33010602011771号