spfa+01 规划
尼玛的哪里错了。。
/*
在有向图上找一个环,使结点权值和/边权和的比例值最大
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 规划的更多相关文章
- mmc线性0-1规划问题
本题目来自物理学苑,原作者认为mmc不容易解决0-1规划. 5个人选4个,组队游泳接力比赛,最好成绩组队. 其实,mmc解决此类问题,还是很方便,轻松的. 下面是原题目的求解:
- Python小白的数学建模课-05.0-1规划
0-1 规划不仅是数模竞赛中的常见题型,也具有重要的现实意义. 双十一促销中网购平台要求二选一,就是互斥的决策问题,可以用 0-1规划建模. 小白学习 0-1 规划,首先要学会识别 0-1规划,学习将 ...
- 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 ...
- In Action(SPFA+01背包)
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- LinGo:疏散问题——线性规划,0-1规划
个部门(A.B.C.D.E)组成.现要将它的几个部门迁出甲市,迁至乙市或丙市. (每个城市最多接纳三个部门) 除去因政府鼓励这样做以外,还有用房便宜,招工方便等好处.对这些好处已作出数量估计,其值如下 ...
- Network Wars-ZOJ2676最小割+01规划
Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge Network of Byteland consists of n servers ...
- POJ 2728(最优比率生成树+01规划)
Dese ...
- bzoj3597[Scoi2014]方伯伯运椰子 01分数规划+spfa判负环
3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 594 Solved: 360[Submit][Statu ...
- POJ 3621 Sightseeing Cows 01分数规划,最优比例环的问题
http://www.cnblogs.com/wally/p/3228171.html 题解请戳上面 然后对于01规划的总结 1:对于一个表,求最优比例 这种就是每个点位有benefit和cost,这 ...
随机推荐
- android Notification总结
在发送一个Notification前,我们需要准备好一个NotificationManager NotificationManager manager = (NotificationManager) ...
- web请求流程
具体流程解析参考文章:浏览器请求发起处理
- Python18 Django 基础
本节内容 上节项目基础语法补充 Django请求的生命周期 通过这张图,我们可以很好的解释一下这个问题. Django请求的生命周期是由客户端的请求开始:经由路由系统找到相对应的视图函数:视图函数到h ...
- Python笔记 【无序】 【二】
序列list() ——把一个可迭代对象[可以是字符串,元组]转化为列表,可不带参数——生成空列表,或者带一个迭代器作为参数tuple() ——可迭代对象转化为元组str(obj) ——把obj对象转换 ...
- shell 在手分析服务器日志【转】
自己的小网站跑在阿里云的 ECS 上面, 偶尔也去分析分析自己网站服务器日志,看看网站的访问量.看看有没有黑阔搞破坏!于是收集,整理一些服务器日志分析命令,大家可以试试! awk '{print $1 ...
- 10分钟搭建Kubernetes容器集群平台【转】
官方提供3种方式部署Kubernetes minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境 ...
- PC端的鼠标拖拽滑动
1.滑块拖拽 html: <div id="div1"> js: <script> var oDiv=null; ; ; window.onload=fun ...
- liunx中的iptables
作者:邓聪聪 iptables的入站端口放行策略: iptables -A INPUT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ...
- mysql导入sqlserver数据库表
原文:https://zhidao.baidu.com/question/1114325744502691499.html 在Navicat for MySQL 管理器中,创建目标数据库(注意:因为是 ...
- hibernate框架学习之数据查询(QBC)helloworld
package cn.itcast.h3.query.hql; import java.util.List; import org.hibernate.Criteria; import org.hib ...