#图# #SPFA# #Tarjan# ----- BZOJ1179】的更多相关文章

SPFA算法 SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法. 判负环(在差分约束系统中会得以体现).如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图) tarjan算法 Tarjan算法是用来求有向图的强连通分量的. Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树.搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量. 定义D…
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机.航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机.那么Alice和Bob这次出行最少花费多少? Input 数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数.…
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„” 在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符卡)带来的便捷. 现在,不需要立下契约也可以使用魔法了!你还不来试一试? 比如,我们在魔法百科全书(Encyclopedia  of  Spells)里用“freeze”作为关键字来查询,会有很多有趣的结果. 例如,我们…
以往对于差分约束理解不是太深,导致这题屡次被坑,在此记录一下细节的理解. 差分约束实际上就是利用了spfa的一个特性:只要有$dis_y>dis_x+w_{x,y}$就松弛,直到所有边关系都满足$dis_y\le dis_x+w_{x,y}$,而这一不等式恰好可以套在差分约束问题里.差分约束要求满足前面这个玩意,把每个变量的值看做$dis_i$,建边,跑spfa最短路,使得所有边都满足关系.这个之前就已经明白了. 但是忽视了一点:注意到跑出来的最短路中$dis$即为$x$的一组合法取值,并且这组…
/* bfs搜索!要注意的是点与点的权值是不一样的哦! 空地到空地的步数是1, 空地到墙的步数是2(轰一炮+移过去) 所以用到优先队列进行对当前节点步数的更新! */ #include<iostream> #include<queue> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int n, m; ][]; struct node{ in…
Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 17538   Accepted: 5721 Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They want to propagate th…
Description Solution 显然缩强连通分量,然后求最长路,虽然是DAG但还是有点麻烦,于是用了spfa. Code 重建图_数组写错好多次,感觉做这题也就是练了一下实现. #include<cstdio> #include<algorithm> using namespace std; ; int pre[maxn],low[maxn],clock; int scc[maxn],val[maxn],cnt,a[maxn],t; int head[maxn],f[ma…
Solution 好题啊没的说. 本题需要求出仙人掌的直径,但仙人掌是一个带有简单环的一张图无法直接用树形dp求解,但它有一个好东西就是没有类似环套环的东西,所以我们在处理时就方便了一些. 思路:tarjan找环,对于不在环上的边或点,树形dp求解,对于每个环,dp求解(单调队列优化), 下面主要说一下代码的实现, void tarjan(int u,int ff) { dfn[u]=low[u]=++top; deep[u]=deep[ff]+; for(int i=head[u];i;i=a…
/** problem: http://poj.org/problem?id=3177 tarjan blog: https://blog.csdn.net/reverie_mjp/article/details/51704523 v 为下一结点, u为当前结点 如果low[v] > dfn[u] 则 边(u,v)为桥 缩点后剩下的所有边都为桥(缩点后即为树结构) 将叶子结点相连使其成为双联通分量为最优解 所以: 添加(leaf + 1) / 2 条边即可使图成为双联通图 **/ #includ…
缩点后转化成 DAG图上的单源最长路问题.spfa/dp随便. #include<cstdio> #include<queue> #include<algorithm> #include<vector> #include<cstring> using namespace std; ],sum,n,m,Us[],Vs[],t,w[],sta,k,ans,dis[]; ],inq[]; struct Edge{int v,w;Edge(const i…