![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图
文章平均质量分 78
shiqi_614
这个作者很懒,什么都没留下…
展开
-
POJ 3660 Cow Contest
题意:有N只牛,M场比赛的结果,问有多少只牛的排名可以确定。排名可以确定的牛说明它与任何一只牛比较,都是可以知道胜负的,通过题目给出的比赛或者通过前面的比赛结果推出。用floyd。#include #include #include using namespace std;const int N=105;bool map[N][N];void floyd(int n);int原创 2012-01-27 22:33:32 · 946 阅读 · 0 评论 -
POJ 1155 TELE(树型DP)
题意:有一个电视台广播节目,广播的网络用一棵树表示,节点1表示电台,叶子结点表示用户,用户愿意付一定的钱去收看这个节目,从非叶子结点到其他结点需要一定的费用(即从中继点到另一个中继点需要一些钱),问最后在不亏本的情况下,最多能使多少人收看到节目。定义dp[i][j]表示在节点i为根节点的子树下,有j个人收看节点的最大利润。状态转移方程是:dp[i][j]=max(dp[i][j],dp原创 2012-10-24 00:56:48 · 1598 阅读 · 0 评论 -
hdu 2242 考研路茫茫――空调教室(Tarjan+树型DP)
题意:给你N个点,M条无向边,并且每个点有一个权值,问把哪条边去掉,能使图分成两个部分,并且这两个部分的权值差最小。跑一次Tarjan转化成一棵树,然后跑一次树型DP(特别注意重边的处理)。#include #include #include #include using namespace std;const int N=10005;struct Edge{ i原创 2012-10-24 20:50:32 · 2830 阅读 · 0 评论 -
POJ 3162 Walking Race(单调队列或线段树加树型DP)
题意:给你一棵有n个节点的树,树边为权值,要你求出树上每个点到其他点的距离中最大的那个值。对求出的从节点1到节点n最大值,找出最长的一段使得这一段中最大值减最小值的结点小于等于m。对于第一个问题,有两种方法可以解决。第一种比较简单的方法是,每个点到其他点的距离中最大的那个值,一定是到树的直径的两个端点的距离之一(反证法易得)。那么我们找出树的直径的同时,处理出各个节点到树直径两个端点的距离就可原创 2012-10-24 01:13:52 · 2419 阅读 · 0 评论 -
Codeforces Round #170 (Div. 1) E.Binary Tree on Plane
题意:平面上有N个点,每个点u可以向其他v连边,只要点u的y坐标大于点v的y坐标,要求将这些点连成一棵二叉树,即树中的每个节点最多连出去两条边,问连成的二叉树的边权和最小为多少。二分图的最小费用流,每个点拆成出点和入点,由超级源点到所有的入点建容量为2,费用为0的边,由所有的出点到超级汇点建容量为1,费用为0的边,当点u可以向点v连边的时候,将点u的入点向点v的出点连容量为1,费用为距离的边。原创 2013-03-01 03:08:39 · 993 阅读 · 0 评论 -
srm575_div1&2_1000(网络流)
题意:给你一个N*M的矩阵,矩阵上的空位用'.'表示,非空位'X'表示。用L型的东西放进矩阵里,问最多能放多少个。每个L型的物体可以随意旋转90度。 物体之间不能相互覆盖。不能覆盖那些已经有X的格子。每个L型的转角必须是黑色的格子。一个格子是黑色,它的定义为,i+j是偶数 。如果数据范围小的话,用当前列的去更新下一列的,当前列可能对应着不同的方格占据方案,那么利用原创 2013-04-30 14:46:15 · 1000 阅读 · 0 评论 -
hdu 4338 Simple Path
题意:有N个点,M条边,下面M行给出M条边后,有Q个询问,给你两个点,起点s,终点t,问从起点s到终点t的简单路径中(简单路径没有环),不包括图中的哪些点,如果s和t重合,那么就输出N-1,如果s无法到达t,输出N,否则输出路径中不包括的点的个数。用点双连通分量建图(割点可以在不同的块中),然后求LCA。比如对于这样的图:拿割点和点双连通分量建图后:原创 2013-04-30 13:43:11 · 1692 阅读 · 0 评论 -
Codeforces Round #147 (Div. 2) E Build String(最小费用流)
题意:给你一个目标串str_t,你可以用下面的n个串(str[N][N]),每个串str[i]中选出limit[i]个字符,从第i个串中拿出一个字符消耗代价是i。问构成这个串最小的代价是多少,如果不能构成这个目标串str_t则输出-1。设置一个超级源点st和超级汇点ed。超级源点到每个str[i]建立一条容量为limit[i],代价为0的边。将目标串拆成26个字母,根据目标串中有多少个这个字符原创 2012-10-26 20:04:48 · 1447 阅读 · 3 评论 -
网络流最大流的sap()算法
现在想将一些物资从S运抵T,必须经过一些中转站。连接中转站的是公路,每条公路都有最大运载量。 每条弧代表一条公路,弧上的数表示该公路的最大运载量。最多能将多少货物从S运抵T? 这是一个典型的网络流模型。为了解答此题,我们先了解网编流的有关定义和概论。 若有向图G=(V,E)满足下列条件: 1.原创 2012-09-15 19:38:46 · 8235 阅读 · 2 评论 -
hdu 4114 Disney's FastPass
题意:游戏园里有N个区域,有M条边连接这N个区域,有K个要访问的景点。对于每个景点告诉你这个景点所在的区域,要访问这个景点需要等待一定时间,如果没有FastPass,等待时间有Ti,否则等待时间为FTi,接下来的Ni,表示有Ni个区域可以得到这个景点的FastPass,问从区域1出发,再回到区域1所需要的最少时间。状态压缩,dis[i][s1][s2],表示当前走到这个点,s1表示拿到了哪些景原创 2013-09-06 20:50:42 · 3439 阅读 · 0 评论 -
Codeforces Beta Round #11 D. A Simple Task
题意:有N(最多19个)个点,M条边,问有多少个简单环。状态压缩,dp[st][i],终点是i,st表示这个环走过哪几个,定义起点为这些走过的点里最小的。#pragma comment(linker, "/STACK:102400000,102400000")#include #include #include #include #include #include #incl原创 2013-09-07 01:53:26 · 2880 阅读 · 0 评论 -
Codeforces Beta Round #89 (Div. 2) E. Bertown roads
题意:有N个点,M条无向边,决定每条边的方向,使得图中任何一个点都能到达其他点。起先起着如何去决定每条边的方向,无果,最后发现其实只要dfs一次就可以,挺有意思的一道题。#include #include #include #include #include #include #include #include #include using namespace std;原创 2013-09-04 10:37:26 · 2648 阅读 · 0 评论 -
Codeforces Beta Round #27 D. Ring Road 2
题意:有一个环,现给你一些区间的起点与终点,区间可以在环内,可以在环外,但是在环内环外的区间都不能彼此相交,问可能否,如果可能,输出方案。2-SAT。#include #include #include #include #include #include #include #include #include using namespace std;typedef原创 2013-09-17 23:47:17 · 2744 阅读 · 0 评论 -
POJ 2486 Apple Tree(树型DP)
题意:给你一棵树,树上的每个节点都有权值,从一个节点到另一个节点需要的步数是1,问从节点1开始,给你步数为K,问能得到的最大权值是多少。定义dp[i][j][0]表示从节点i出发能走j步最后不回到i点能得到的最大权值是多少。定义dp[i][j][1]表示从节点i出发能走j步最后回到i点能得到的最大权值是多少。那么状态转移方法就可以知道了,如果还要回到u点,从节点u转移到节点v就需要两步原创 2012-10-24 00:51:41 · 739 阅读 · 0 评论 -
POJ 1849 Two(树的直径)
题意:给你一棵树,每条边都有权值,给你两个人去遍历这棵树,问将这棵树遍历完的最小代价是多少,给定两个人的起点,两个人不一定要回到起点。求出所有的边的权值和,然后减去树的直径就可以了。#include #include #include using namespace std;const int N=100005;struct Edge{ int v,w; Edge* n原创 2012-10-24 00:42:14 · 1255 阅读 · 0 评论 -
hdu 4293 Groups
题意:有 n 个人,可任意分成若干组,然后每个人各提供一个信息,表示他们组前面有多少个人,后面有多少个人。问最多有多少个信息是不冲突的。可以用DP,也可以转化成求最长路。DP,设这n个人的编号是从1到n,则每个的提供的信息可以转化成一段区间[a+1,n-b]。那么问题就可以转化成有最多有多少个区间是互不相交的。将区间按终点排序后跑DP。dp[i]=max(dp[j]+num[i]) (0原创 2012-09-21 20:22:18 · 868 阅读 · 0 评论 -
POJ 3259 Wormholes
题意:有T组测试数据,N个点,M条双向边,W条负权单向边。问是否存在负权回路。bellman_ford。#include #include #include using namespace std;const int N=3005;int dis[N];struct node{ int x,y,w; void fun(int a,int b,int c){x=原创 2012-01-27 21:59:54 · 493 阅读 · 0 评论 -
POJ 1860 Currency Exchange
题意:给出N种货币,M种兑换方式,现在手上有X的货币总价值为VAL。接下来有M行,每行开始两个数字表示两种可以相互兑换的货币A,B,然后是A兑换成B的比率,手续费,B兑换成A的比率,手续费。问是否可以兑换增加手中的VAL。Bellman_ford。#include #include #include using namespace std;const int N=105;doub原创 2012-01-27 22:24:23 · 722 阅读 · 0 评论 -
POJ 1511 Invitation Cards
题意:有T组测试数据,每组测试数据有N个点,M个路线。接下来的M行有三个数字,分别代表每条路线的起点,终点,权值,从点1到其他点的和为A,其他点到点1的和为B,问A+B的最小值。SPFA#include #include #include #include using namespace std;const int N=1000005;bool vis[N];int next原创 2012-01-27 23:58:16 · 696 阅读 · 0 评论 -
POJ 2387 Til the Cows Come Home
题意:有T条路径,N个点,问从点N到点1的最短路径有重边。。。dijkstra算法#include #include #include using namespace std;#define INF 1<<30const int N=1005;bool vis[N];int map[N][N],dis[N];int main(){ int n,t;原创 2012-01-27 17:49:47 · 675 阅读 · 0 评论 -
POJ 2253 Frogger
题意:给出n个点,问从点1到点2的一条路径中,每两点之间的距离的最大值的最小值。dijkstra的变形。#include #include #include #include using namespace std;const int N=205;bool vis[N];int dis[N];struct node{ int x,y;}po[N];int ca原创 2012-01-27 20:55:46 · 640 阅读 · 0 评论 -
POJ 1797 Heavy Transportation
题意:给你n个城市,m条道路,问从城市1到城市n的最小的边的权值的最大值是多少?#include #include #include using namespace std;const int N=1005;bool vis[N];int map[N][N],dis[N];int main(){ int t,t_cnt=0; scanf("%d",&t);原创 2012-01-27 21:22:27 · 528 阅读 · 0 评论 -
POJ 3268 Silver Cow Party
题意:有n个点,m条有方向的边,中心在x。问从其他点到x,然后再从x到其他点的最小距离的最大值是多少?正向建跑一次最短路,反向建图再跑一次最短路。#include #include #include using namespace std;const int N=1005;bool vis[N];int map[N][N],dis1[N],dis2[N];int main()原创 2012-01-27 21:43:36 · 604 阅读 · 0 评论 -
POJ 2240 Arbitrage
题意:有N种货币,M种兑换关系,问最后是否有可能取得套利(通过兑换让原来的钱增加)floyd。#include #include #include #include #include using namespace std;const int N=35;double rate[N][N];void floyd(int);int main(){ int n,m,t原创 2012-01-27 22:51:50 · 481 阅读 · 0 评论 -
POJ 1330 Nearest Common Ancestors(求LCA的三种方法)
1.离线Tarjan 设我们求点对(u,v)的最近公共祖先。 利用在DFS过程中,从点u第一次到点v的过程中,必定是从u开始,经过u和v的最近公共祖先的S,然后到达v的,这时候u和v都是在S为根结点的子树里的。 如果我们在访问v的时候,u已经被访问过了,这时候,如果我们知道u在以哪个结点S为根结点的子树里,我们就知道它们的公共祖先了,即S。借助并原创 2012-08-08 04:29:37 · 2041 阅读 · 2 评论 -
hdu 4276 The Ghost Blows Light(树型DP)
题意:给你n个点,n-1条边构成树,每条边有边树,每个点有点权(表示走每条边的时间),问在时间T从点1走到点n,能够得到最多的点权有多少。树型DP。先用spfa跑出从点1到点n的最短路。如果这最短的时间已经超过T,那么就是无法完成的。容易知道,最短路径上的边只会经过一次且必须经过一次,而其他边会经过两次。将最短路径上的边的权值赋值为0,使得DP的过程一定会经过这些边。剩下的就是树型DP的问题了原创 2012-09-11 21:39:13 · 1839 阅读 · 0 评论 -
图的强连通分量,块,割点,桥
写在前面:整合和参考了网上的一些相关文章和刘汝付佳的《内功心法》里的部分内部。 因为在求强连通分量,块,割点,桥的时候,其基本过程是DFS,所以对DFS的一基本的知识作些介绍。 为了叙述方便,规定DFS过程将给结点着色:白色为没有考虑过的点,黑色为已经完全考虑过的点,灰色为发现过但没有处理过的点。灰色点组成了遍历边界。DFS遍历 DFS遍历优先扩展新发原创 2012-08-06 01:59:05 · 16906 阅读 · 2 评论