T1 最小圈 bzoj 1486

题目大意:

一个环的权值平均值为定义为一个这个环上所有边的权值和除以边数

求最小的环的权值平均值

思路:

二分一个值 把所有边减去这个值

判断是否有负环

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define inf 1061109567
#define ll long long
#define MAXN 6010
#define eps 1e-9
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,vis[MAXN],fa[MAXN],q[MAXN],f;
double l,r,mid,ans,dis[MAXN],val[MAXN<<],v[MAXN<<];
int to[MAXN<<],nxt[MAXN<<],fst[MAXN],cnt;
void add(int u,int v,double w) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w;}
void spfa(int x)
{
vis[x]=;
for(int i=fst[x];i;i=nxt[i])
if(dis[x]+v[i]<dis[to[i]])
if(vis[to[i]]){f=;return;}
else {dis[to[i]]=v[i]+dis[x];spfa(to[i]);}
vis[x]=;
}
int check(double x)
{
for(int i=;i<=cnt;i++) v[i]=val[i]-x;
for(int i=;i<=n;i++) dis[i]=0.0;
memset(vis,,sizeof(vis));f=;
for(int i=;i<=n;i++)
{spfa(i);if(f) return ;}
return ;
}
int main()
{
n=read(),m=read();int a,b;double c;
while(m--) {a=read(),b=read();scanf("%lf",&c);add(a,b,c);}
l=-1e7,r=1e7;
while(r-l>=eps)
{
mid=(l+r)/2.0;
if(check(mid)) ans=mid,r=mid-eps;
else l=mid+eps;
}
printf("%.8lf",ans);
}

T2 虫洞 bzoj 1715

题目大意:

一个无向图中有一些虫洞 虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻

求是否可以借助这些虫洞来回到出发时刻之前

思路:

把有向图的边权改为负的 直接用dfs的spfa判负环即可

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define inf 1061109567
#define ll long long
#define MAXN 3010
#define eps 1e-5
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m1,m2,dis[MAXN],vis[MAXN],fa[MAXN],q[MAXN],f;
int to[MAXN<<],nxt[MAXN<<],val[MAXN<<],fst[MAXN],cnt;
void add(int u,int v,int w) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w;}
void spfa(int x)
{
vis[x]=;
for(int i=fst[x];i;i=nxt[i])
if(dis[x]+val[i]<dis[to[i]])
if(vis[to[i]]){f=;return;}
else {dis[to[i]]=val[i]+dis[x];spfa(to[i]);}
vis[x]=;
}
int main()
{
int T=read();
while(T--)
{
n=read(),m1=read(),m2=read(),f=;int a,b,c;
memset(dis,,sizeof(dis));memset(vis,,sizeof(vis));
memset(fst,,sizeof(fst));cnt=;
while(m1--) {a=read(),b=read(),c=read();add(a,b,c);add(b,a,c);}
while(m2--) {a=read(),b=read(),c=read();add(a,b,-c);}
for(int i=;i<=n;i++)
{spfa(i);if(f) {puts("YES");goto ed;}}
puts("NO");
ed:;
}
}

T3 Easy sssp vijos 1053

题目大意:

判断这个有向图中是否存在负权回路

如果存在负权回路, 只输出一行-1 如果不存在负权回路, 再求出一个点S到每个点的最短路的长度

思路:

不知道我的dfs spfa 为什么T了

于是选择bfs 如果一个点进队n次 则有负环

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define inf 2147483647
#define ll long long
#define MAXN 50100
#define eps 1e-9
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,vis[MAXN],fa[MAXN],q[MAXN<<],l,r,f,st,inq[MAXN],num[MAXN];
int to[MAXN<<],nxt[MAXN<<],fst[MAXN],dis[MAXN],val[MAXN<<],cnt;
void add(int u,int v,int w) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w;}
int spfa(int s)
{
memset(inq,,sizeof(inq));
memset(num,,sizeof(num));
for(int i=;i<=n;i++) dis[i]=inf;
dis[s]=,q[l=r=]=s;int x;
while(l<=r)
{
x=q[l++],inq[x]=;
if(dis[s]<) return ;
for(int i=fst[x];i;i=nxt[i])
if(!vis[to[i]]&&dis[to[i]]>dis[x]+val[i])
{
dis[to[i]]=dis[x]+val[i];
if(!inq[to[i]]) q[++r]=to[i],inq[to[i]]=;
if(++num[to[i]]>n) return ;
}
}
for(int i=;i<=n;i++) vis[i]=vis[i]||num[i];
return ;
}
int check()
{
for(int i=;i<=n;i++)
if(!vis[i]) if(!spfa(i)) return ;
return ;
}
int main()
{
n=read(),m=read(),st=read();int a,b,c;
while(m--) {a=read(),b=read(),c=read();add(a,b,c);}
if(check()) {puts("-1");return ;}
memset(vis,,sizeof(vis));spfa(st);
for(int i=;i<=n;i++)
if(dis[i]==inf) puts("NoPath");
else printf("%d\n",dis[i]);
}

蓝书3.3 SPFA算法的优化的更多相关文章

  1. 关于SPFA算法的优化方式

    关于SPFA算法的优化方式 这篇随笔讲解信息学奥林匹克竞赛中图论部分的求最短路算法SPFA的两种优化方式.学习这两种优化算法需要有SPFA朴素算法的学习经验.在本随笔中SPFA朴素算法的相关知识将不予 ...

  2. 《SPFA算法的优化及应用》——姜碧野(学习笔记)

    一.核心性质:三角不等式.最短路满足d[v]<=d[u]+w(u,v) 二.SPFA两种实现: 常见的是基于bfs的,这是直接对bellman-ford用队列维护.根据最短路的长度最长为(n-1 ...

  3. 并不对劲的图论专题(三):SPFA算法的优化

    1.bzoj1489-> 这是个新套路. 我们希望找到最小的x,那么可以二分x,然后判断是否存在圈的边权的平均值小于等于x. 设圈的边权依次为w1,w2,w3,…,wk,平均值为p, 则有p= ...

  4. 蓝书2.2 KMP算法

    T1 Radio Transmission bzoj 1355 题目大意: 一个字符串,它是由某个字符串不断自我连接形成的 但是这个字符串是不确定的,现在只想知道它的最短长度是多少 思路: kmp 输 ...

  5. 队列优化dijsktra(SPFA)的玄学优化

    转载:大佬博客 最近想到了许多优化spfa的方法,这里想写个日报与大家探讨下 前置知识:spfa(不带任何优化) 由于使用较多 STLSTL ,本文中所有代码的评测均开启 O_2O2​ 优化 对一些数 ...

  6. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  7. SPFA求最短路——Bellman-Ford算法的优化

    SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE), ...

  8. SPFA算法 - Bellman-ford算法的进一步优化

    2017-07-27  22:18:11 writer:pprp SPFA算法实质与Bellman-Ford算法的实质一样,每次都要去更新最短路径的估计值. 优化:只有那些在前一遍松弛中改变了距离点的 ...

  9. luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...

随机推荐

  1. JS 比较运算符 逻辑运算符

    逻辑运算符 三元运算符 摘自:http://www.w3school.com.cn/js/js_comparisons.asp

  2. 10-看图理解数据结构与算法系列(B+树)

    B+树 B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点.内部节点和叶子节点.多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引, ...

  3. <c:foreach> 标签获取循环次数

    <c:forEach var="i" begin="1" end="9" varStatus="status"&g ...

  4. POJ 3348 最直接的凸包问题

    题目大意: 给定一堆树的点,找到能组合成的最大面积,一个物体占50面积,求最多放多少物体 #include <cstdio> #include <cstring> #inclu ...

  5. j简单的分类实现-K近邻

          dataSetSize=dataSet.shape[0]                          voteIlabel=labels[sortedDistIndicies[i]] ...

  6. restful(1):序列化

    restful协议中,一切皆是资源,操作只是请求方式 model_to_dict()方法: from django.forms.models import model_to_dict obj = Pu ...

  7. 【ZJOI2017 Round1后记】

    2017.4.1: NOIP+Round1综合成绩出来,标准分离续命线差了80分,果然还是联赛坑挖太大了…… 不管怎么说能续命的话还是要试一下的…… 发毒誓:Round2前不打手游,不看NGA,不看星 ...

  8. 不同app之间activity的跳转

    关键在于指定activity的action属性 <activity android:name=".HardActivity"> <intent-filter> ...

  9. HDU 1754_I Hate It

    [题意]给定区间求最大值 [分析]线段树单点更新 [代码] #include<cstdio> #include<iostream> using namespace std; c ...

  10. Ubuntu 16.04安装WinRAR/7-Zip(基于CrossOver)

    基于CrossOver的WinRAR/7-Zip有如下缺点: 1.不能像Windows那样右键菜单解压 可以解决的问题: 1.可以使用提供的浏览工具进行文件选择再解压,只是在操作上多一步. 2.类似百 ...