尼玛的哪里错了。。

/*
在有向图上找一个环,使结点权值和/边权和的比例值最大
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哪些属性可以继承

    不可继承的:display.margin.border.padding.background.height.min-height.max- height.width.min-width.max-wid ...

  2. java包装类型的坑

    开发中有遇到Long类型比较是否相等,比如Long A和Long B判断是否相等,当时习惯性的直接A==B: 自测的话确实么有问题,但是测试那边测试就有问题,当时郁闷了一下然后换成了A.equals( ...

  3. I - Magic FZU - 2280 (字符串hash)

    题目链接: I - Magic FZU - 2280 学习链接: FZU - 2280 I - Magic 题目大意: 给你nn个字符串,每个字符串有一个值ww,有qq次询问,一共两种操作:一是“1, ...

  4. Flask里面的cookie的基本操作

    #cookie相关操作,依赖于make_response #调用cookie依赖request模块 from flask import Flask,make_response,request #建立对 ...

  5. 转: hibernate配置文件hibernate.cfg.xml和.hbm.xml的详细解释

    http://blog.csdn.net/yuhui123999/article/details/51886531 hibernate.cfg.xml -标准的XML文件的起始行,version='1 ...

  6. Django学习手册 - ORM 数据创建/表操作 汇总

    ORM 查询的数据类型: QuerySet与惰性机制(可以看作是一个列表) 所谓惰性机制:表名.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它 ...

  7. yum upgrade卡在 清理initial-setup-0.3.9.30-1.el7.centos.x86_64

    我安装CENTOS7.2,用yum -y update进行更新 卡在这里了 清理 : initial-setup-0.3.9.30-1.el7.cent 目测是一个系统bug,执行关闭命令解决: sy ...

  8. 使用@RequestBody将请求体映射到Action方法参数中

    @PostMapping("/user") public User create(@RequestBody User user){ System.out.println(user. ...

  9. Xilinx原语学习之时钟资源相关原语

    一直来,都是使用Vivado中自带的GMIItoRGMII IP核来完成GMII转RGMII的功能:尽管对GMII及RGMII协议都有一定的了解,但从没用代码实现过其功能.由于使用IP时,会涉及到MD ...

  10. mac技巧之常用的快键键

    1.修改文件名 选中文件按return键即可修改文件名. 2.文件预览 选中文件按照空格键即可实现文件的预览(并不是打开文件) 3.任务之间进行切换 command+tab 4.复制文件 推动文件按照 ...