随笔分类 - HDU
摘要:题意:给出一张有向图,现在要你删去一些边构造一张新图,新图的要求有1.对于起点s,出度-入度=1.2.对于终点t,入度-出度=1.3.对于其余的点,入度=出度.另外,保留每条边需要花费ai,删掉每条边需要花费bi。现在求一个最小花费的方案使得能够构造出符合要求的图。看到这题首先想到以前做过的几个混合图欧拉回路的问题,因为本题跟混合图欧拉回路有一些类似的地方,比如说,我无法去控制每个点具体的出度入度到底是多少,但是可以知道它们之间的关系。并且对于每条边,我都不知道到底该不该留,所以可能会考虑先假定它到底是留下还是不留,然后利用每个点度数的关系跟源汇相连,用网络流去求解一个方案。所以本题就应该是一
        阅读全文
                
摘要:题意:Little Tom要“环”游一些城市,每个城市只能游玩一次。现在给出一张有向图和每条边的费用。求最小费用。要走环,很容易想到二分图匹配。这里还是一样的,拆点。把每个点拆开,变成i,i',分别和源点S汇点T相连,费用是0,容量是1。然后对原图中的每条边(u,v),对应边(u,v',1,cost),跑费用流,如果最大流=城市数,说明存在一个方案,答案就是最小费用流算出来的费用。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 210 6 #define maxm 100000 7 #define INF 
        阅读全文
                
摘要:好题。搜的题解敲的,没什么好多说的。但是还是想说两点:1.本来一直不理解为什么这种博弈的问题可以用DP去做,因为双方都采用最优策略的情况下,不知道他会如何选择,但是今天明白了,这种博弈问题,对于给定的一个状态,其结果就已经是确定了的。因此可以由一个最初的确定的状态搜出所有的其他状态。另外,这里的dp数组只要赋值一次就可以了,因为不管输入的数据怎么变,给定的状态的结果是不会变的。2.能在现场赛中做出这种难度的DP,是我的目标,当然,这还需要很多的努力和练习。毕竟就算这道题告诉我是DP了,我也不知道怎么设计状态。还有好几个容易出问题的小细节我都出问题了。差距还是很大的。 1 #include 2.
        阅读全文
                
摘要:题意:给出一张有可能自环、重边的有向图。每个节点i上都有两个值Wi+,Wi-,分别表示删掉所有i点的入边需要的代价和删掉所有i点的出边需要的代价。现在要求把所有的边全部删掉,求最小代价。显然一条边只和个点有关,要删掉一条边(i,j),要么付出Wi-,要么付出Wi+,很容易让人想到二分图。其实这就是一个二分图点权覆盖的问题。把每个点i拆为i,i'。对所有的Wi+,对应边(i',T,Wi+),对所有的Wi-.对应边(S,i,Wi-),对于图中所有的边(u,v),对应边(u,v',inf)。然后求最小割就是答案。 1 #include 2 #include 3 #includ
        阅读全文
                
摘要:题意:开始的时候p=1,2个人轮流对p进行操作,每次操作中,他们可以选择把p乘上一个数,这个数的范围是2-9。现在的问题是,给你一个n,两人轮流操作,谁先把p操作到p>=n谁就获胜,两人都采用最优策略,问谁获胜。根据给定的n,可以找出一些必胜、必败的区间。不如说给出的n是162,那么必败的区间是[18,161],必胜的区间是[9,17]。显然先手一次就可以把p的值直接变成9,所以先手可以获胜。然后去递推这些区间就行了,直到递推到区间左边的值为小于10的数。然后判断一下这个区间是必胜的还是必败的区间,被谁取到就可以了。 1 #include 2 using namespace std; 3
        阅读全文
                
摘要:题意:有N艘船和N个港口,M个station。现在N艘船分别处在一些station上。有K条边连接站,有P条边连接港口和站。现在这N艘船都要回到港口,且每个港口只能容纳一艘船。问使这N艘船回到港口行程之和的最小值是多少。比较明显的求最小权匹配,用KM。做最短路的时候要注意如果船已经回到港口了,就不能再跑出去了,所以做floyd闭包或其他最短路的时候,松弛的时候不能用港口去松弛一个点对。然后得到各个船所在位置到各个港口的最短路后,把边权赋成负的船到港口的最短路值,然后跑KM就可以了。 1 #include 2 #include 3 #include 4 #include 5 #...
        阅读全文
                
摘要:裸的KM吧。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 105 6 #define INF 1 G[maxn]; 11 int W[maxn][maxn],n; 12 int Lx[maxn],Ly[maxn]; 13 int left[maxn]; 14 bool S[maxn],T[maxn]; 15 16 void init(int n) 17 { 18 this->n = n; 19 for(int i = 0...
        阅读全文
                
摘要:题意:给出一张有n个点m条边带权的无向图,要你找出若干个回路并且使得所有的点都在某个哈密顿回路上,且所有的点只能出现在一个哈密顿回路中,求由n条边组成的若干回路的最小权值。跟HDU 3488基本一样,只不过把有向图改成了无向图。#include #include #include #include #define maxn 2010#define maxm 410000#define INF 1 Q; for(int i = 0;i 0 && d[u] + cost[i] < d[v[i]]){ d[v[i]] = d[u] + cost[...
        阅读全文
                
摘要:题意:给出一张有n个点m条边带权的有向图,要你找出若干个回路并且使得所有的点都在某个回路上,且所有的点只能出现在一个回路中,求由n条边组成的若干回路的最小权值。所有点只能出现在一个回路中,因此,所有的点都对应唯一的前驱或后继,因此这就是一个匹配问题。如果有边(u->v),边权为w,那它就对应二分图中的一条边(u,v',w),直接这样建图跑KM就可以了。当然,用这种写法的费用流会比较慢。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 410 6 #define maxm 70000 7 #define INF 
        阅读全文
                
摘要:题意:挖金矿。一个矿有n层,每层有m块金子。要挖每块金子都有一个代价cost,每块金子都有一个价值cost,另外每块金子还有w个关系,表示如果要挖它,必须先挖掉第i层的第j块金子,求最大获利。最大闭合子图。 1 #include 2 #include 3 #include 4 #define maxn 3010 5 #define maxm 400000 6 using namespace std; 7 typedef long long LL; 8 const LL INF = 1LL 0) add_edge(S,pos,value),sum += value;78 ...
        阅读全文
                
摘要:题意:有n个城市。现在需要在这些城市上修一些通信的基站,在每个城市上修一个基站都需要花费一定的费用。另外给出m个组合(a,b,c),表示如果第a个城市和第b个城市都修起了基站,那么公司可以获利c。但公司并不需要在每个城市都修基站,他们只希望自己能够获得最大的利益。问最大利益。裸的最大闭合子图吧。只要知道这个模型就是水题。 1 #include 2 #include 3 #include 4 #include 5 #define INF 1<<30 6 #define maxn 55010 7 #define maxm 400000 8 using namespace std; 9 
        阅读全文
                
摘要:题意:给出一张n个点m条边的有向图。现在编号为1的城市想进攻编号为n的城市。n为了防御1的进攻,需要破坏一些道路使得1到n不连通,而破坏每条路都有一个代价,题目会告诉你。现在编号为1的城市想要让编号为n的城市花费尽量多的代价来破坏道路使得1到n不连通,因此他们可以在2-n中的任意城市间修一条无坚不摧的桥(这条桥既可以是原来存在的也可以是原来不存在的),问n花费的最大代价。本来想先求一遍最小割,然后还原网络,把所有的割边的容量设为inf,求一遍最大流这样得到结果的。但是存在1到n不连通的情况,因此就不能求出最小割了。所以用到了一个更加暴力的方法。先求一遍最大流,得到maxflow,这是如果没有修
        阅读全文
                
摘要:题意:问有多少个N(N 2 #include 3 typedef long long LL; 4 LL dp[70][70][101]; 5 LL pow_mod(LL a,LL p,LL n){ 6 if(p == 0) return 1; 7 LL ans = pow_mod(a,p/2,n); 8 ans = ans * ans % n; 9 if(p%2 == 1) ans = ans * a % n;10 return ans;11 }12 13 int main(){14 int nkase;15 scanf("%d...
        阅读全文
                
摘要:题意:给出一张有n个点的图,有的边又向,有的边无向,现在要你破坏一些路,使得从点0无法到达点n-1。破坏每条路都有一个代价。求在代价最小的前提下,最少需要破坏多少条道路。(就是说求在最小割的前提下,最小的割边数)这题做了长姿势了。偏移量的方法没有想到。如果采用偏移量的方法的话,把每条边的边权w设为w'=w*MOD+1,然后求最小割,那么maxflow%MOD就是答案了。前提是MOD足够大。另外一种方法,利用一个结论:最小割边一定满流,满流的未必是最小割边。假设所有满流的边都是最小割边,把它们的cap全部设为1,其余未满流的边的cap设为inf,然后求最小割,答案就是最小割值。虽然没搞懂
        阅读全文
                
摘要:题意:给出一颗树和树根,每条树边都有边权,要你砍断一些边,使得所有的叶子节点都与根节点分离,且要求砍断的边权之和最小。以树根root为源点S,添加一个汇点T,对所有的非跟叶子节点i,加边(i,T,inf),求最小割即可。 1 #include 2 #include 3 #include 4 #include 5 #define INF 1<<30 6 #define maxn 1010 7 #define maxm 10000 8 using namespace std; 9 10 int u[maxm],v[maxm],next[maxm],w[maxm];11 int firs
        阅读全文
                
摘要:题意:一个国家的地图是一张n个点m条边的有向图。你保卫了国家成为了英雄,现在国王答应给你一些城市。国王居住在首都,编号为1,但他不想随意的到达你的领地,所以你必须破坏一些路,使得从首都到你所拥有的所有城市不连通。而破坏这些路需要花钱。国王给了你f个城市供你选择,每个城市有一个价值。你最后的总收益=你选择的城市的价值之和-破坏路花费的钱。现在让你输出最大的收益,以及完成这样的收益应该破坏哪些路。首先对于表示这个国家地图的有向边(u,v,cost),直接在图中建一条一样的边(u,v,cost)。对于供你选择的城市i,假设它的价值是value,创建一个汇点T,建一条(i,T,value)的边。然后以
        阅读全文
                
摘要:题意:给出一张有向图。如果一个节点在图中被删除后,就能使得从S->T不连通,则称这个点key vertex。问这张图中有多少个点是key vertex。网上有两种说法,一种是网络流,就是拆点建图,求最小割,为了限制增广次数,把S、T拆点后的容量限制到2,这样一来跑最大流得到maxflow,如果maxflow=0,则说明全部的点都可以是key vertex,如果maxflow=2,则说明只有S、T是key vertex,如果maxflow=1的话,就需要到残量网络中去找了。怎么找呢?首先从S出发始寻找在残量网络中可以到达的所有的点,把它们保存在一个队列里,并记上vis标记,然后把这个队列里
        阅读全文
                
摘要:题意:有一个n*m的矩阵,里面可以放金蛋也可以放银蛋。分别给出在2个矩阵map1,map2表示在矩阵的每个格子里放金蛋的得分和放银蛋的得分。如果相邻的两个格子里都放了金蛋,则总得分要减去G,如果相邻的两个格子里都放了银蛋,则总得分要减去S。现要求你求出放蛋的最大得分。跟HDU 3657比较像,但是这里更加复杂了,因为两种得分,一种金蛋,一种银蛋。所以我的理解是这里是两个二分图合起来的一个二分图,因为金蛋和银蛋存在一个匹配的关系,给矩阵染色后,黑格和白格也存在一个匹配的关系。因此,这样建图:假设行数i+列数j这和为偶数的格子为黑格,奇数的为白格,每个格子拆成两个点k,k',分别表示放金蛋
        阅读全文
                
摘要:题意:有个人有一种记单词方法,如果一个单词的最后一个字母和另外一个单词的首字母相同,他就同时可以记住,现在他想按照这样的规则把n个单词串起来(就是一个单词的最后一个字母和另外一个单词的首字母相同),有些单词的回文串也是有意义的,因此他既可以正着记,也可以倒着记,现在问他能不能调整那些回文串有意义的单词的正序逆序把这n个单词串起来。混合图的欧拉路径,不是欧拉回路。如果是混合图的欧拉回路问题,在《网络流建模汇总》这篇论文里已经有了具体的方案了。这里需要做的处理就是,如果存在合法路径,而这个路径不构成回路的话,那么我们可以人为的找出起点和终点(就是度数为奇数的点,且只有两个,根据入度出度谁大谁小可以
        阅读全文
                
摘要:题意:给出一个N*M的矩阵,0表示空地,1表示有一只羊,2表示有一只狼,你可以再图上方格的边缘添加单位长度为1的栅栏使得任意的动物都不能通过。问最少添加多少个单位长度为1的栅栏使得狼抓不到羊。是我想的太多了,可能是因为我想少去建条边。其实这里件图建的还是很暴力的。对所有相邻的格子,都建一条cap=1的边,另外,所有有羊的格子,从源点S到羊所在的格子建一条cap=inf的边,对所有有狼的格子,都从有狼的格子到汇点T建一条cap=1的边。求出的最小割容量就是答案。 1 #include 2 #include 3 #include 4 #include 5 #define INF 1 1) ...
        阅读全文
                
 
                    
                     
                    
                 
                    
                
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号