HDU 4971 A simple brute force problem. 强连通缩点+最大权闭合图

该博客介绍了如何利用强连通缩点和最大权闭合图的方法来解决一个项目收益优化问题。题目给出n个项目和m个技术难题,每个项目有收益,每个技术难题有花费。完成项目可能需要解决多个技术难题,且存在技术难题之间的依赖关系。博主通过将问题转化为图论问题,先进行强连通缩点,然后求解最大权闭合图,以实现最大收益的计算。
摘要由CSDN通过智能技术生成


题意:

给定n个项目,m个技术难题

下面一行n个数字表示每个项目的收益

下面一行m个数字表示攻克每个技术难题的花费

下面n行第i行表示

第一个数字u表示完成 i 项目需要解决几个技术难题,后面u个数字表示需要解决的问题标号。

下面m*m的矩阵

(i,j) = 1 表示要解决j问题必须先解决i问题。

(若几个问题成环,则需要一起解决)

问:最大收益。

思路:

先给问题缩点一下,每个缩点后的点权就是这个点内所有点权和。

然后跑一个最大权闭合图。


#include<stdio.h>  
#include<string.h>  
#include<iostream>  
#include<algorithm>  
#include<vector>  
#include<set>
using namespace std;  
const int MAXN = 1000;//点数的最大值  
const int MAXM = 40010;//边数的最大值  
const int INF = 0x3f3f3f3f;  

#define inf 100000000
struct isap{
    struct Edge  
    {  
        int to,next,cap,flow;  
    }edge[MAXM];//注意是MAXM  
    int tol;  
    int Head[MAXN];  
    int gap[MAXN],dep[MAXN],cur[MAXN];  
    void add(int u,int v,int w,int rw = 0)  
    {  
        edge[tol].to = v; edge[tol].cap = w; edge[tol].flow = 0;  
        edge[tol].next = Head[u]; Head[u] = tol++;  
        edge[tol].to = u; edge[tol].cap = rw; edge[tol].flow = 0;  
        edge[tol].next = Head[v]; Head[v] = tol++;  
    }  
    int Q[MAXN];  
    void BFS(int start,int end)  
    {  
        memset(dep,-1,sizeof(dep));  
        memset(gap,0,sizeof(gap));  
        gap[0] = 1;  
        int front = 0, rear = 0;  
        dep[end] = 0;  
        Q[rear++] = end;  
        while(front != rear)  
        {  
            int u = Q[front++];  
            for(int i = Head[u]; i != -1; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值