感觉去年9月的自己好$naive$ http://www.cnblogs.com/candy99/p/5868948.html

现在不也是嘛


裸题,具体看学习笔记

二分答案之后判负环就行了

$dfs$版超快

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
const int N=,M=;
const double eps=1e-;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,u,v;
double f[N];
struct edge{
int v,ne;
double w;
}e[M<<];
int h[N],cnt=;
inline void ins(int u,int v,int w){
cnt++;
e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
}
double d[N];
int inq[N],num[N];
int q[N],head,tail;
inline void lop(int &x){if(x==N) x=;}
bool NegativeCircle(double mid){
head=tail=;
for(int i=;i<=n;i++) d[i]=,inq[i]=,q[tail++]=i,num[i]=;
while(head!=tail){
int u=q[head++];lop(head);inq[u]=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;double w=mid*e[i].w-f[u];
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(!inq[v]){
inq[v]=;q[tail++]=v;lop(tail);
if(++num[v]>n) return true;
}
}
}
}
return false;
}
inline bool check(double mid){return NegativeCircle(mid);}
void solve(){
double l=,r=;
while(r-l>eps){
double mid=(l+r)/2.0;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.2f",l);
}
int main(){
freopen("in","r",stdin);
n=read();m=read();
for(int i=;i<=n;i++) f[i]=read();
for(int i=;i<=m;i++) u=read(),v=read(),ins(u,v,read());
solve();
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
const int N=,M=;
const double eps=1e-;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,m,u,v;
double f[N];
struct edge{
int v,ne;
double w;
}e[M<<];
int h[N],cnt=;
inline void ins(int u,int v,int w){
cnt++;
e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
}
double d[N];
int vis[N],cl;
bool dfs(int u,double mid){
vis[u]=cl;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;double w=mid*e[i].w-f[u];
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(vis[v]==vis[u]) return true;
else if(dfs(v,mid)) return true;
}
}
vis[u]=;
return false;
}
bool NegativeCircle(double mid){
memset(vis,,sizeof(vis));
for(cl=;cl<=n;cl++) if(dfs(cl,mid)) return true;
return false;
}
inline bool check(double mid){return NegativeCircle(mid);}
void solve(){
double l=,r=;
while(r-l>eps){
double mid=(l+r)/2.0;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.2f",l);
}
int main(){
freopen("in","r",stdin);
n=read();m=read();
for(int i=;i<=n;i++) f[i]=read();
for(int i=;i<=m;i++) u=read(),v=read(),ins(u,v,read());
solve();
}

最新文章

  1. [No0000AD]7z源码完全移植至Visual Studio 2015
  2. DAY2 raw_input() 与 input() Python
  3. 计蒜客 删除字母&#39;c&#39;
  4. ByteBuffer解析
  5. 注册表 ReadBool类型和 ReadInteger 的关系
  6. linux更改shell
  7. MySQL(5.6) 函数
  8. 【Xamarin 开发 IOS --使用 Storyboard Segue 实作 UIViewController 的切换 (实例)】
  9. debian install &amp; configure(2)-drivers-ati
  10. Boost源代码学习---shared_ptr.hpp
  11. Apriori算法Python实现
  12. OAF隐藏显示题头
  13. url参数解析 and 日期格式化
  14. 三个线程,ABC 10次(volatile+synchronized)
  15. pycharm汉化(3.6版本)
  16. Spring Core Programming(Spring核心编程) - AOP Concepts(AOP基本概念)
  17. 8th,常用模块、正则表达式
  18. js,html-点击直接跳转到页面底/顶部
  19. Python基础1 介绍、基本语法
  20. Ubuntu下SVN安装和配置

热门文章

  1. PL/SQL 实现行列转换
  2. 在windows下详解:大端对齐和小端对齐
  3. 了解前端中的SPA
  4. Git的简单的基本使用
  5. webzip怎么用 如何用webzip下载整个网站?
  6. HTML 5 &lt;canvas&gt; 标签
  7. Navicat如何进行搜索筛选
  8. Centos6.9安装Node.js+npm爬坑
  9. java.lang.reflect.InvocationTargetException
  10. myeclipse编码