hdu 6437 /// 最小费用最大流 负花费 SPFA模板

题目大意:

给定n,m,K,W 

表示n个小时 m场电影(分为类型A、B)

K个人 若某个人连续看了两场相同类型的电影则失去W 电影时间不能重叠

接下来给定m场电影的 s t w op 

表示电影的 开始时间s 结束时间t 看完这场电影则获得w 电影类型是op(0为A 1为B)

 

将一场电影拆成两个点 s t,两点间连线花费为-w容量为1

源点与所有电影的s点连线 花费为0容量为1

所有电影的t点与汇点连线 花费为0容量为1

若两场电影的时间不冲突 那么按时间顺序在之间连边

若类型相同 花费为W容量为1 否则 花费为0容量为1

最后设超级源点与源点连边 花费为0容量为K 表示最多K个人

此时求出的 最小花费最大流 的最小花费 就是 最后最少的失去

最少的失去 就是 最大的获得的相反数

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int N=405;
const int mod=1e9+7;

int n,m;
struct NODE { int s,t,w,op; }node[205];
struct Edge
{
    int from,to,cap,flow,cost;
    Edge(int u,int v,int ca,int f,int co):from(u),to(v),cap(ca),flow(f),cost(co){};
};

struct MCMF
{
    int n,m,s,t;
    vector<Edge> edges;
    vector<int> G[N];
    int inq[N];//是否在队列中
    int d[N];//距离
    int p[N];//上一条弧
    int v[N];//可改进量

    void init(int n) //初始化 顶点为 0~n-1
    {
        this->n=n;
        for(int i=0;i<=n;i++) G[i].clear();
        edges.clear();
    }

    void AddEdge(int from,int to,int cap,int cost)//加边
    {
        edges.push_back(Edge(from,to,cap,0,cost));
        edges.push_back(Edge(to,from,0,0,-cost));
        int m=edges.size();
        G[from].push_back(m-2);
        G[to].push_back(m-1);
    }

    bool SPFA(int s,int t,int &flow,int &cost)//寻找最小费用的增广路,使用引用同时修改原flow,cost
    {
        for(int i=0;i<n;i++) d[i]=INF;
        memset(inq,0,sizeof(inq));
        d[s]=0;inq[s]=1;p[s]=0;v[s]=INF;
        queue<int>Q; Q.push(s);
        while(!Q.empty()) {
            int u=Q.front(); Q.pop();
            inq[u]--;  
            for(int i=0;i<G[u].size();i++) {
                Edge& e=edges[G[u][i]];
                if(e.cap>e.flow && d[e.to]>d[u]+e.cost) {//满足可增广且可变短
                    d[e.to]=d[u]+e.cost;
                    p[e.to]=G[u][i];
                    v[e.to]=min(v[u],e.cap-e.flow);
                    if(!inq[e.to]) inq[e.to]++,Q.push(e.to);
                }
            }
        } 
        if(d[t]==INF) return false;//汇点不可达则退出
        flow+=v[t];
        cost+=d[t]*v[t];
        int u=t;
        while(u!=s) {//更新正向边和反向边 
            edges[p[u]].flow+=v[t];
            edges[p[u]^1].flow-=v[t];
            u=edges[p[u]].from;
        }
        return true;
    }

    int MincotMaxflow(int s,int t)
    {
        int flow=0,cost=0;
        while(SPFA(s,t,flow,cost));
        return cost;
    }
}MM;

int main()
{
    int _; scanf("%d",&_);
    while(_--) {
        int n,m,K,W;
        scanf("%d%d%d%d",&n,&m,&K,&W);
        MM.init(2*m+3);
        inc(i,1,m) {
            int s,t,w,op;
            scanf("%d%d%d%d",&s,&t,&w,&op);
            node[i]={s,t,w,op};
            MM.AddEdge(i*2,i*2+1,1,-w);
            MM.AddEdge(1,i*2,1,0);
            MM.AddEdge(i*2+1,m*2+2,1,0);
        }
        inc(i,1,m) inc(j,i+1,m) {
            if(node[i].t<=node[j].s) {
                if(node[i].op==node[j].op)
                    MM.AddEdge(i*2+1,j*2,1,W);
                else MM.AddEdge(i*2+1,j*2,1,0);
            }
            if(node[j].t<=node[i].s) {
                if(node[i].op==node[j].op)
                    MM.AddEdge(j*2+1,i*2,1,W);
                else MM.AddEdge(j*2+1,i*2,1,0);
            }
        }
        MM.AddEdge(0,1,K,0);
        int ans=MM.MincotMaxflow(0,m*2+2);
        printf("%d\n",-ans);
    }

    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/zquzjx/p/10447816.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值