POJ 1344
摘要:题意:给定一棵含有n片叶子的树,告诉你每片叶子到其它叶子的距离,求整棵树的权值。题解:1、假设最后已经生成一棵完整的树,其中某个结点上必定会有至少两片叶子,否则该结点可以直接去掉而不影响最后的结果。 2、对于这种有两片叶子以上上作为孩子的结点,除该子树的所有的结点到它的叶子都会经过该节点,所以可以直接将该子树缩点变成一个大点,记录这个结点到其他所有点的距离。 3、反复进行2这种操作,直至最后只剩一个结点。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using
阅读全文
POJ 1636
摘要:题意:都含有m个犯人的两个监狱要等量交换至多[m/2]个犯人,约数条件是监狱A的第i个犯人不能和监狱B的第j个犯人在同一个监狱,问小于且最接近[m/2]的交换人数。题解:1、为了方便,让B监狱的犯人编号从m+1开始。可以看出,交换的图是一个二分图,如果左边的第i个点不能和第j个点共处,那么就让它们连一条边,将边连完之后,满足约数条件的交换实际上就是同属于一个连通分量的所有左右的两边的点进行交换,否则,必然会有矛盾出现。 2、记录1中所有的这种情况,即合法交换需要用多少个A监狱的人去换多少个B监狱的人。 3、dp[a][b]代表A监狱交换了a个人,B监狱交换了b个人是否可行,转移方程就是...
阅读全文
POJ 2781
摘要:题意:给出人际关系网络,求一个人要寻到另一个人需要经过的最少中间人数。题解:裸的最短路。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=100005,M=N*100,inf=0x3f3f3f3f; 6 int head[N],nc,list[N],f,r,dist[N],vis[N]; 7 struct Edge 8 { 9 int to,next;10 }edge[M];11 void ad
阅读全文
POJ 2662
摘要:题意:求无向图中从1走到2的满足条件的路径条数,条件:从A能到B,当且仅当B到终点的最短路径小于A到终点的最短路径。题解:spfa预处理所有点到终点的距离,记忆化搜索统计个数。View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N=1005,M=4000000; 6 int dist[N],head[N],list[N],dp[N],r,f,nc; 7 bool vis[N]; 8 struct Ed
阅读全文
POJ 3345
摘要:题意:一个国家想贿赂至少m个国家,给出贿赂每个国家需要的钱及他们的附属关系。如果贿赂了主国,其从属国家也同样视为被贿赂了,且关系网无环。题解:树形DP,dp[now][i]为以第now国家为子树的国家团体贿赂了i个国家所需要的最小花费,在建立一个虚拟结点0,让它与所有主国建立一条边。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<map> 5 #include<string> 6 using namespace std;
阅读全文
POJ 2631
摘要:题意:找一颗树中的最长路。题解:两边bfs,第一次以任意结点开始,找到一个距离它最远的结点,第二次从该节点开始,找到距离它最远的路,这边是最长路。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=10005,M=1000000; 6 int head[N],nc; 7 struct Edge 8 { 9 int to,cost,next;10 }edge[M];11 void add(int a
阅读全文
POJ 2607
摘要:题意:n个点的无向带权图,上面有f个消防站,现在要添加一个消防站,求一个最好且最小的标号的方法,使得原图中每个点到它最近的消防站的距离中的最大值要最小。题解:1、以f个消防站所在位置为起点,做一次spfa求出它们到其他所有点的最小距离。 2、枚举每个点,从该点出发求一次spfa求出它到所有点的距离。在该点放消防站的代价就是max(所有的i=>min(d[i],dist[i]))。 3、PS:消防站可能一开始就遍布整个图,即,每个点都有消防站,此时,理论上是不用放的,但是ZF钱太多,还是要建一座,就是第1座,所以枚举是要赋初值= =!。View Code 1 #include<cs.
阅读全文
POJ 2062
摘要:题意:两个人打牌,牌的大小按照2,3,4...9,T,J,Q,K,A排序,如果点数相等就按照H>S>D>C的花色排序。告诉你第一个人的手牌,让你安排第二个人的手牌,使得得分最大(按照顺序依次比较每张牌大小)题解:先建立两人牌比较的二分图,就是第二个人的第i张牌如果比第一个人第j张牌大,就建立i->j的边,然后求一次二分匹配得答案。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 bool g[3
阅读全文
POJ 2425
摘要:题意:给定一个有向无环图,然后上面的一些结点上面有棋子,每次一个人可以选择一枚棋子走到与它相邻的点,不能走的就输了。然后给出初态,判断胜负。题解:图上面的SG博弈,dfs求SG函数,然后依次取异或就行了。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int sg[1005],head[1005],nc; 6 struct Edge 7 { 8 int to,next; 9 }edge[1000000];10 voi
阅读全文
POJ 3697
摘要:题意:给出一个n个点的无向完全图,然后删去m条边,问还有哪些点与1相连(不包括1)题解:n<=10000,m<=1000000,若直接建反图无论怎样都会暴内存,因为最多1Y条边。于是将删去的边存入hash表中,每次走动时看看边是否在hash表中即可。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int mod=10000007; 6 int hash[mod]; 7 int getkey(i
阅读全文
POJ 2724
摘要:题意:m个长度为n的2进制数,可能某一位是*代替(代表*=1和*=0都被包含了)。要求用最少的另外一些二进制数(也可以某一位被*代替)将原来的那些覆盖(且只能覆盖一次),且要求不能覆盖原本不存在的二进制数。题解:由于*可以覆盖两个二进制数,所以*用的最大的时候就是题目要求的解。如果两个二进制数只相差一位,那么这两个二进制数就可以用一个带*的二进制数就可以覆盖了,由于要求不能覆盖两次,实际上就成了求二分图最大匹配。最后匹配可以覆盖掉ret*2个,剩下的就只能用单一不含*的去覆盖了。View Code 1 #include<cstdio> 2 #include<cstring&g
阅读全文
POJ 1034
摘要:题意:主人带狗去散步,主人走n个点,狗在每个点都会与主人碰头,但其余时候都是各自溜达,除此之外,狗还会去找一些有趣的地方(共m个),每次离开主人狗最多去一个有趣的地方。狗的速度最快是人的两倍,求使得狗到达最多有趣点的方法。题解:对于人从第i个点到第i+1个点,这条路作为三角形的一边c,然后遍历其他点,若j与这两个点组成的边即为a,b如果a+b<=c则g[i][j]=true,然后做二分图最大匹配,就是狗最多能到的点。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm>
阅读全文
POJ 3614
摘要:题意:c头牛日光浴,有l个区域可以选择。每头牛需要的光照强度区间告诉了,然后每个区域的光强以及可以承载的牛数告诉了,求最大满足的牛数量。题解:最大流。对于S到每头牛建一条流量为1的边,然后每头牛到它能到的区域建一条流量为1的边,每个区域到T建一条流量为该区域承载牛数量的边。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=6000,M=1000000; 6 const int inff=1<
阅读全文
POJ 1130
摘要:题意:给出一个有向图,起点为0,终点为m,求删去一个最靠近m且不是m的点,使得0不能到m。题解:dijiskra求一遍反向最短路,然后枚举所有dist<ans的点,删去它后0还能否到m。View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N=10000; 6 int head[N],dist[N],nc,_nc,_head[N]; 7 struct Edge 8 { 9 int to,next;
阅读全文
POJ 2567
摘要:题意:给定一棵无根树,每次选编号最小的叶子删除,并将与该叶子相连的结点编号输出来。PS:无根树叶子的定义:度为1的点。题解:按照拓扑排序方法,每次选择度为1且编号最小的点,将与它相连的点输出来,并将其度减一。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cctype> 5 using namespace std; 6 int head[100],nc; 7 struct Edge 8 { 9 int to,next;10 } ed
阅读全文
POJ 3018
摘要:题意:d维的n个箱子,装同样是d维的礼物,要求用一个套一个的方式装(每一维都要严格小于才能装进去),求最多用多少个箱子。如果不能装下的话就输出“Please look for another gift shop!”题解:由于箱子装下另一个箱子的条件是严格小于,所以装箱的图是一个有向无环图,然后在这上面找最长路即可(需要先对所有箱子的d维指数排序)。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int head[60
阅读全文
POJ 3272
摘要:题意:n个点m条边的有向图,从所有入度为0的点出发到达n,问所有可能路径中,经过的某条路的最大次数是多少。边全是由标号小的到标号大的。题解:正向走一遍,记录到达某点的路径总数,反向走一遍,记录某点出发到终点的总情况数。枚举每条边,求边对应两点所记录的两个信息之积的最大值。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=5005; 6 typedef long long ll; 7 int he
阅读全文
POJ 3257
摘要:题意:牛要建立长为n的云霄飞车,可以有m个事件点,每个事件设计4个变量,即从a点开始,长为b,给牛f的开心值,要花费c元。牛总共有b元,它们想从0开始,一直经历事件点到最后,使得开心值最大,求此值。题解:对每个事件点建立一条边,同时用dp[i][j]代表第i个点话费了j的钱所能得到的最大开心值,然后用类似dijiskra的算法,从0到n-1开始松弛,再从dp[n][..]中选一个最大的即可。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namesp
阅读全文
POJ 1734
摘要:题意:给定一个无向图,有重边,求最小代价环,环上点数必须大于2题解:类似floyd,在进行最小距离的同时,枚举点k的两端是否形成回路,如果形成,必定是没有经过重复点的,因为那样就不是最小距离,而经过点k的弧的松弛操作还没进行,所以也不会经过kView Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int inf=1<<29; 6 int dist[105][105],map[105][105],pre
阅读全文
POJ 1486
摘要:题意:给定n张幻灯片,每张都有数字,由于幻灯片是透明的,所以不能确定每个数字指的是哪个,于是问你能确定哪些。题解:二分匹配,然后再对每一个点检验,即找到它当前未匹配的对象且能够与它进行匹配的,将他们进行匹配,然后找因此而失配的那个点的增广路,能找到就说明不能确定。View Code 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int link[30],rlink[30],n; 5 bool g[30][30],chk[30]; 6 bool findpath(int x) 7 { 8 .
阅读全文
|
|
|