AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

数学建模

作者: 作者的头像   lihua777 ,  2023-03-19 16:42:58 ,  所有人可见 ,  阅读 40


0


#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9;
const int N = 10, M = N * N / 2;
int p[7] = {0, 3, 9, 12, 5, 18, 4};
int h[N], ne[M], e[M], w[M], idx;
int dist[N];
int n;

void add(int a,int b,int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

void build(int S6)
{
    memset(h,-1,sizeof h);    
    idx = 0;

    add(0, 6, S6), add(6, 0, -S6);
    for(int i = 2; i <= 6; i ++) add(i - 2, i, p[i]);
    for(int i = 1; i <= 1; i ++) add(4 + i, i, p[i] - S6);
    for(int i = 1; i <= 6; i ++) add(i - 1, i, 0);
}


bool spfa(int c)
{   //求最长路,判断正环
    queue<int> q;
    vector<bool> st(N, false);
    vector<int> cnt(N, 0);
    memset(dist, -0x3f, sizeof dist);
    build(c);

    //差分约束从源点出发
    q.push(0);
    st[0] = true;
    dist[0] = 0;

    while(q.size())
    {
        int t = q.front();
        q.pop();
        st[t] = false;
        for(int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dist[j] < dist[t] + w[i])
            {
                dist[j] = dist[t] + w[i];
                cnt[j] = cnt[t] + 1;
                if(cnt[j] >= 7) return false;
                if(!st[j])
                {
                    q.push(j);
                    st[j] = true;
                }
            }
        }
    }
    return true;
}


int main()
{   
    int l = 0, r = INF;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (spfa(mid)) r = mid;
        else l = mid + 1;
    }
    if (r == INF) cout << "No Solution!" << endl;
    else cout << l << endl;
    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息