Acwing 361.观光奶牛(spfa求负环,01分数规划)

简介: 笔记

Acwing 361.观光奶牛


题意

给定一张 L个点、P条边的有向图,每个点都有一个权值f[i],每条边都有一个权值t[i]。


求图中的一个环,使“环上各点的权值之和”除以“环上各边的权值之和”最大。


输出这个最大值。


注意:数据保证至少存在一个环。


思路

24.png


代码

// Author:zzqwtcc
// Problem: 观光奶牛
// Contest: AcWing
// Time:2021-10-24 21:51:14
// URL: https://www.acwing.com/problem/content/363/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
#include<bits/stdc++.h>
#include<unordered_map>
// #define int long long
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define MOD 998244353
#define rep(i, st, ed) for (int (i) = (st); (i) <= (ed);++(i))
#define pre(i, ed, st) for (int (i) = (ed); (i) >= (st);--(i))
// #define debug(x,y) cerr << (x) << " == " << (y) << endl;
#define endl '\n'
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
template<typename T> inline T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<typename T> inline T lowbit(T x) { return x & -x; }
template<typename S,typename T>void debug(S s, T t){cerr << s << " == " << t << endl;}
template<typename T>void debug(T t){cerr << t << endl;}
template<typename T>void debug(T t[],int st,int ed){for(int i = st; i <=ed;++i){cerr << t[i] << " ";}cerr << endl;}
template<typename T>void debug(const vector<T>&t){for(int i =0 ; i < t.size();++i)cerr << t[i] << " ";cerr << endl;}
// template<typename T> T qmi(T a, T b = mod - 2, T p = mod) { T res = 1; b %= (p - 1 == 0 ? p : p - 1); while (b) { if (b & 1) { res = (LL)res * a % p; }b >>= 1; a = (LL)a * a % p; }return res % mod; }
const int N = 1e3 + 10;;
int n, m;
int f[N];
vector<PII>vec[N];
bool st[N];
int d[N];
int cnt[N];
bool spfa(double mid){
  memset(st,0,sizeof st);
  memset(cnt,0,sizeof cnt); 
  queue<int>q;
  rep(i,1,n)q.push(i),st[i] = true;
  while(q.size()){
    int u = q.front();
    q.pop();
    st[u] = false;
    for(int i = 0 ;i < vec[u].size();++i){
      int j = vec[u][i].second;
      int dis = vec[u][i].first;
      if(d[j] < d[u] + f[u] - mid * dis){
        d[j] = d[u] + f[u] - mid * dis;
        cnt[j] = cnt[u] + 1;
        if(cnt[j] >= n)return true;
        if(!st[j]){
          st[j] = true;
          q.push(j);
        }
      }
    }
  }
  return false;
}
void solve() {
    cin >> n >> m;
    rep(i,1,n)scanf("%d",&f[i]);
    while(m--){
      int u,v,w;scanf("%d%d%d",&u,&v,&w);
      vec[u].push_back({w,v});
    }
    double l = 0.0,r = 1010.0;
    while(r - l > 1e-4){
      double mid = (l + r ) / 2;
      if(spfa(mid))l = mid;
      else r = mid;
    }
    printf("%.2lf\n",r);
}
signed main() {
    //int _; cin >> _;
    //while (_--)
        solve();
    return 0;
}
目录
相关文章
|
6月前
|
Java C++
poj 1503 高精度加法
把输入的数加起来,输入0表示结束。 先看我Java代码,用BigINteger类很多东西都不需要考虑,比如前导0什么的,很方便。不过java效率低点,平均用时600ms,C/C++可以0ms过。
16 1
|
9月前
AcWing 867. 分解质因数
AcWing 867. 分解质因数
|
5月前
hdu1406 完数 (水题)
hdu1406 完数 (水题)
27 0
|
6月前
poj 1990 MooFest 树状数组
题意就是有N头牛,每头牛都有一个坐标和声调值(x, v),两头牛之间通讯要花费的能量是他们的距离乘以最大的一个音调值,现在要任意两头牛之间都相互通讯一次,求总共需要花费多少能量?
20 0
|
6月前
|
图形学 C++
ZOJ1117 POJ1521 HDU1053 Huffman编码
Huffman编码的思想就是贪心,我们这里使用stl里的优先队列,priority_queue使用堆进行优化,虽然自己也可以写一个堆,但我感觉对于这道题有点主次不分了,再次感觉到stl确实是一个很强大的东西。
16 0
|
API
L - 小希的迷宫 HDU - 1272
L - 小希的迷宫 HDU - 1272
56 0
|
Java
「日更刷题」59.螺旋矩阵
「日更刷题」59.螺旋矩阵
49 0
LeetCode每日一题——812. 最大三角形面积
给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。
57 0
LeetCode每日一题——812. 最大三角形面积
周娟老师讲授的快速幂:整数快速幂、矩阵快速幂。
周娟老师讲授的快速幂:整数快速幂、矩阵快速幂。
80 0
AcWing 756. 蛇形矩阵
AcWing 756. 蛇形矩阵
49 0
AcWing 756. 蛇形矩阵