摘要:
int dfs(int u,int augu){ int augv=0,v,delta,mind= n-1; if(u==T) return augu; for(v=S;v0){ if(dist[u]==dist[v]+1){ ... 阅读全文
摘要:
1.最优性、可行性剪枝 2.估计搜索空间大小 3.选择合适搜索对象 4.选择搜索方向 5.控制搜索深度I.D,DFS,IDA* 6启发式(估值函数) 7.双向搜索:DFS:中间相遇(meet in the middle) BFS:双向BFS 阅读全文
摘要:
题目 分析:在对角线上全是1,逆向思考这个问题,将对角线上的1回到他们原来的地方后,发现这些1中没有任何两个在同一行或同一列,也就是这个图是一个置换矩形。 将每一行,每一列编号,分别作为x部和y部,将1所在的行列连边,求最大匹配。 至... 阅读全文
摘要:
题目 本题实质是求第k短的路径; SPFA+A* 进行启发式搜索直至访问终点k次, 估值函数:当前已经走的距离+当前点到终点的最短路 注意:当s==t时,要特判#include#include#include#includeusing namespace std;#define M... 阅读全文
摘要:
bool dfs(int u){ for(node *p=adj[u];p;p=p->next){ if(vis[p->v]) continue; vis[p->v]=1; if(!c[p->v]||dfs(c[... 阅读全文
摘要:
题目分析:二分图匹配,和ZOJ1052差不多,但是草地在计算连通块是当做空地,在连边是如果交点是草地则不连边。代码:#include#include#define MAXN 50int n,a[MAXN+10][MAXN+10],cnt,cnt1,c[MAXN*MAXN*2+10]... 阅读全文
摘要:
题目 二分图匹配,建图方式巧妙,横向连通块(在一行,中间没有障碍物)、纵向连通块分别为x,y部,相交的连边,求最大匹配。#include#include#define MAXN 4int n,a[MAXN+10][MAXN+10],cnt,cnt1,c[MAXN*MAXN*2+10... 阅读全文
摘要:
题目描述:点击此处 解题思路: 构造最小生成树,并计算苗条度,然后不断删最短边,用kruskal构造最小生成树,计算苗条度,直至图不再连通,输出苗条度。 若一开始就不是一棵树,则输出-1;因为kruskal是贪心的算法,所以确定了最小边之后,最大边也随之确定,且最大边最小。实现代码... 阅读全文
摘要:
题目 分析:显然是搜索,bfs比较慢,那就用A*吧,但是并不能直接用A*求最短路,因为在你讲迷宫拉伸了之后,你一开始找的最短路并不一定最短(我是这么觉得,自己想想),所以就二分拉伸的比例,然后用A*进行Check。代码#include#include#include#include... 阅读全文
摘要:
题目 分析:这道题看到的第一反应应该就是BFS或者DFS,裸的DFS、BFS显然会TLE,所以我就想用A*,不过好像并不好写启发函数。 枚举步数不行,就枚举边吧。因为允许有两次转折,所以最多有三条边枚举中间的一条边,然后进行check,这道题只用了两个for循环就A... 阅读全文