P6699 【模板】一般图最大权匹配

博客介绍了如何解决图的最大权匹配问题,提供了具体题目的链接,并分享了作者在解决该问题时遇到的难点及代码实现。
摘要由CSDN通过智能技术生成

题目链接

题面:
在这里插入图片描述
这个是真不会。。。。。。
代码:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
#define ll long long
#define llu unsigned ll
using namespace std;
const int maxn=620; //内存开点数的1.5倍
const int inf=0x3f3f3f3f;
struct node
{
   
    int x,y,z;
    node(){
   }
    node(int a,int b,int c)
    {
   
        x=a,y=b,z=c;
    }
}g[maxn][maxn];
int n,m,nx,t,lab[maxn],match[maxn],slack[maxn];
int st[maxn],pa[maxn],flower_from[maxn][maxn],S[maxn],vis[maxn];
vector<int>flower[maxn];
deque<int>q;

int dist(node e)
{
   
    return lab[e.x]+lab[e.y]-g[e.x][e.y].z*2;
}

void update_slack(int x,int y)
{
   
    if(!slack[y]||dist(g[x][y])<dist(g[slack[y]][y]))
        slack[y]=x;
}

void set_slack(int y)
{
   
    slack[y]=0;
    for(int x=1;x<=n;x++)
        if(g[x][y].z>0&&st[x]!=y&&S[st[x]]==0)
            update_slack(x,y);
}

void q_push(int x)
{
   
    if(x<=n) return q.push_back(x);
    for(int i=0;i<flower[x].size();i++) q_push(flower[x][i]);
}

void set_st(int x,int b)
{
   
    st[x]=b;
    if(x<=n) return;
    for(int i=0;i<flower[x].size();i++) set_st(flower[x][i],b);
}


int get_pr(int b,int xr)
{
   
    int pr=find(flower[b].begin(),flower[b].end(),xr)-flower[b].begin();
    if(pr%2==1)
    {
   
        reverse(flower[b].begin()+1,flower[b].end());
        return flower[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值