尼玛的哪里错了。。

/*
在有向图上找一个环,使结点权值和/边权和的比例值最大
01规划,设比例为l,那么将每条边的权值改成a[u]-l*w,如果有正权环,则比例l可行
如何判图中存在正权环?将 权值存相反数,spfa判负环即可
复杂度elogans
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define maxn 1005
#define maxm 5005
#define esp 0.0000001
#define INF 0x3f3f3f3f
struct Edge{int from,to,nxt,w;}edge[maxm],e[maxm];
int head[maxn],tot,a[maxn],n,m;
void init(){
memset(head,-,sizeof head);
tot=;
}
void addedge(int u,int v,int w){
edge[tot].from=u,e[tot].from=u;
edge[tot].to=v,e[tot].to=v;
edge[tot].nxt=head[u],e[tot].nxt=head[u];
edge[tot].w=w,head[u]=tot++;
} double d[maxn];
int v[maxn],cnt[maxn];
int judge(double mid){
for(int i=;i<tot;i++){
int u=edge[i].from;
e[i].w=-(1.0*a[u]-mid*edge[i].w);
}
//spfa
for(int i=;i<=n;i++)d[i]=INF*1.0;
memset(v,,sizeof v);
memset(cnt,,sizeof cnt);
d[]=;v[]=;
queue<int>q;
q.push();cnt[]=;
while(!q.empty()){
int x=q.front();q.pop();
v[x]=;
for(int i=head[x];i!=-;i=edge[i].nxt){
int y=edge[i].to,z=e[i].w;
if(d[y]>d[x]+z){
d[y]=d[x]+z;
if(v[y]==)q.push(y),v[y]=;
if(++cnt[y]>n)return ;
}
}
}
return ;
} int main(){
while(scanf("%d%d",&n,&m)==){
init();
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
double l=0.0,r=100.0,mid;
while(l+esp<=r){
mid=(l+r)/;
if(judge(mid))l=mid;
else r=mid;
}
printf("%.2lf\n",l);
}
return ;
}

下面这样的就没问题了。。

#include<cstdio>
#include<cstring>
#include<queue>
#define eps 1e-3
#define MAXN 1010
using namespace std;
struct T
{
int v;
int w;
int next;
}edge[];
int cnt,head[MAXN];
void add_edge(int u,int v,int w)
{
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt++;
}
int n,m;
int w[MAXN];
double dis[MAXN];
bool inque[MAXN];
int vis[MAXN];
bool SPFA(double R)//SPFA判断负权环
{
queue<int> myque;
memset(inque,,sizeof inque);
memset(vis,,sizeof vis);
for(int i = ; i <= n; i++)
dis[i] = 1e15;
myque.push();
dis[] = ;
inque[] = ;
vis[]++;
while(!myque.empty())
{
int u = myque.front();
myque.pop();
inque[u] = ;
for(int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].v;
int y = edge[i].w;
if(dis[u] + R*y - w[u] < dis[v])
{
dis[v] = dis[u] + R*y - w[u];
if(!inque[v])
{
myque.push(v);
inque[v] = ;
vis[v]++;
if(vis[v] > n) return ;
}
}
}
}
return ;
}
int main()
{
memset(head,-,sizeof head);
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++)
scanf("%d",&w[i]);
for(int i = ; i <= m; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
}
double l = ,r = ,mid;
while(r - l > eps)
{
mid = (l+r)/;
if(SPFA(mid)) l = mid;//由于我们是把权值取反了的,因此题解中的R过大变成了R过小
else r = mid;
}
printf("%.2lf\n",l);
return ;
}

spfa+01 规划的更多相关文章

  1. mmc线性0-1规划问题

    本题目来自物理学苑,原作者认为mmc不容易解决0-1规划. 5个人选4个,组队游泳接力比赛,最好成绩组队. 其实,mmc解决此类问题,还是很方便,轻松的. 下面是原题目的求解:

  2. Python小白的数学建模课-05.0-1规划

    0-1 规划不仅是数模竞赛中的常见题型,也具有重要的现实意义. 双十一促销中网购平台要求二选一,就是互斥的决策问题,可以用 0-1规划建模. 小白学习 0-1 规划,首先要学会识别 0-1规划,学习将 ...

  3. HDU 4370 0 or 1 (01规划)【Dijkstra】||【spfa】

    <题目链接> 题目大意: 一个n*n的01矩阵,满足以下条件 1.X12+X13+...X1n=12.X1n+X2n+...Xn-1n=13.for each i (1<i<n ...

  4. In Action(SPFA+01背包)

    In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. LinGo:疏散问题——线性规划,0-1规划

    个部门(A.B.C.D.E)组成.现要将它的几个部门迁出甲市,迁至乙市或丙市. (每个城市最多接纳三个部门) 除去因政府鼓励这样做以外,还有用房便宜,招工方便等好处.对这些好处已作出数量估计,其值如下 ...

  6. Network Wars-ZOJ2676最小割+01规划

    Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge Network of Byteland consists of n servers ...

  7. POJ 2728(最优比率生成树+01规划)

                                                                                                    Dese ...

  8. bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 594  Solved: 360[Submit][Statu ...

  9. POJ 3621 Sightseeing Cows 01分数规划,最优比例环的问题

    http://www.cnblogs.com/wally/p/3228171.html 题解请戳上面 然后对于01规划的总结 1:对于一个表,求最优比例 这种就是每个点位有benefit和cost,这 ...

随机推荐

  1. 前端-----css(1)

    css概述 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. css知识点 注释 /* 注释内容 */ css四 ...

  2. 2018牛客暑期ACM多校训练营第二场(有坑未填)

    第二场终于等来学弟 开始(被队友带飞)的开心(被虐)多校之旅 A   run A题是一个递推(dp?)+前缀和 因为看数据量比较大 就直接上前缀和了 一个比较简单的递推 没有太多难点 签到题 需要注意 ...

  3. Cent os 6.8添加中文字体

    作者:邓聪聪 Cent os 6.8添加中文字体的相关步骤: [root@bogon ]#yum -y install fontconfig #yum安装fontconfig [root@bogon ...

  4. U3D虚拟摇杆制作

    来自https://www.cnblogs.com/jiuxuan/p/7453762.html 1.创建两个Image,修改第一个Image名称为 Background,把第二个Image放入 Ba ...

  5. xclip for windows

    下载源码和可执行文件 xclip.7z // The MIT License (MIT) // Copyright (c) 2014 Rapptz // Permission is hereby gr ...

  6. 027_nginx常见优化参数

    一.nginx.conf主配置文件 proxy_ignore_client_abort on; #不允许代理端主动关闭连接

  7. 51nod--1242 斐波那契数列第N项 (矩阵乘法优化)

    题目: 1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) ...

  8. Servlet随笔

    HttpServlet中的getRequestURL.getRequestURI.getContextPath方法获取的字符串为 jsp文件会被编译成一个Servlet,该Servlet继承自Http ...

  9. bsdiff的编译与使用

    bsdiff是一个差异包比较工具,可以用来实现增量更新. 下载地址:http://www.daemonology.net/bsdiff 编译 Mac环境 版本:macOS 10.12 1.解压下载的b ...

  10. MYSQL修改字段

    当字段为空则插入0,不为空则原来的值  UPDATE t_pm_scheduleSET lesson_room_id1 = IFNULL(lesson_room_id1, 0), lesson_roo ...