您当前的位置: 首页 >  图论

钟钟终

暂无认证

  • 2浏览

    0关注

    233博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

8/11 二分图染色+KM算法变型+后缀数组+图论

钟钟终 发布时间:2022-08-12 02:26:22 ,浏览量:2

P6185 [NOI Online #1 提高组] 序列

又因为一个小错误浪费了1个半小时。。。我是真的sb啊! 题意:将数组a经过两种操作使得和b数组相等: 操作1:将a数组中,i和j两个下标的数同时加1或者减1. 操作2:将a数组上两个下标值一个加1一个减一,或者一个减1一个加1 思路: 1.操作2一个加1一个减1,但两个数总和不变,由于该操作的传递性,可形成一个连通块,在此连通块内可任意调整值。可理解为缩点操作 2.操作1对数组a同时加1或减1,可转化为a部点加1,b部点减1,或相反。 若是二分图,则a部点值之和要等于b部点权值之和 若非二分图,则此时只对数组a操作,不涉及操作2,要保证操作前前后奇偶行相同,因为每次操作都是加2或者减去2.

#include
#define int long long
#define endl '\n'

using namespace std;
const int N=7e5+10;
const int inf=0x3f3f3f3f;
int n,m,a[N],b[N],f[N],p[N],q[N],g,sz[N],num[3],col[N];
vectore[N];
int r_find(int r)
{
    return r==f[r]?r:(f[r]=r_find(f[r]));
}
bool dfs(int x,int c)
{
    col[x]=c,num[c]+=sz[x];
    int flag=1;
    for(int i=0;i>n>>m;
    for(int i=1;i>a[i];
    for(int i=1;i>b[i];
    g=0;
    for(int i=1;iop>>x>>y;
        if(op==2) f[r_find(x)]=r_find(y);
        else p[++g]=x,q[g]=y;
    }
    for(int i=1;i            
关注
打赏
1664378814
查看更多评论
0.0427s