zoukankan      html  css  js  c++  java
  • Codeforces 1038E Maximum Matching

    可能写了个假算法

    假设定义:含有一个欧拉路的图为类欧拉图

    欧拉路的定义:一个无向连通图中,存在一条路径对所有边都遍历且仅遍历一次;判断方法:该连通图中度为奇数的点的个数不能超过2,即为0或者2

    题目解法:

    对每一条数据a,b,c,想象成a点与b点之间连了一天值为c的边,则此图共有4个点

    问题变成求图中一个合法的类欧拉图的边权和最大值

    此值等于任意一个连通图的边权值之和,但一种情况除外,即此图中度为奇数的点个数超过2,对应此题中,度为奇数的点的个数即为4,此时连通图的所有边权和大于此图中合法的类欧拉图的边权和最大值,其之间的差值为图中一条边的权值,此边需要满足的条件为:如果这个连通图减去这条边,则可以形成一个合法的类欧拉图即可,此边的最小权值即为代码中的mx

    #include<iostream>
    #include<cstdio> 
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<string.h>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<fstream>
    #include<cstdlib>
    #include<ctime>
    #include<list>
    #include<climits>
    #include<bitset>
    #include<random>
    #include <ctime>
    #include <cassert>
    #include <complex>
    #include <cstring>
    #include <chrono>
    using namespace std;
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    #define fopen freopen("input.in", "r", stdin);freopen("output.in", "w", stdout);
    #define left asfdasdasdfasdfsdfasfsdfasfdas1
    #define tan asfdasdasdfasdfasfdfasfsdfasfdas
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    typedef long long ll;
    typedef unsigned int un;
    const int desll[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    const int mod=1e9+7;
    const int maxn=1e5+7;
    const int maxm=1e5+7;
    const double eps=1e-4;
    int m,n;
    int ar[maxn];
    int ans=0;
    int num[10],sum[5];
    int f[5][5],mx=1e5+7,all;
    bool ma[5];
    pair<pair<int,int>,int> pa[maxn];
    int dfs(int x)
    {
        all+=sum[x];
        ma[x]=1;
        int mid = num[x]%2;
        for(int i=1;i<=4;i++){
            if(f[x][i] && !ma[i])mid += dfs(i);
        }
        return mid;
    }
    void solve(int i)
    {
        memset(ma,0,sizeof(ma));
        all=0;
        int x= dfs(i);
        all/=2;
        if(x==4)ans=max(ans,all-mx);
        else ans=max(ans, all);
    }
    int main()
    {
        scanf("%d",&n);
        memset(num,0,sizeof(num));
        memset(sum,0,sizeof(sum));
        memset(f,0,sizeof(f));
        ans=0;
        for(int i=0;i<n;i++){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            sum[a]+=b;
            sum[c]+=b;
            num[a]++;
            num[c]++;
            f[a][c]++;
            f[c][a]++;
            pa[i]=make_pair(make_pair(a,b),c);
        }
        for(int i=0;i<n;i++){//求mx
            int a=pa[i].first.first,b=pa[i].first.second,c=pa[i].second;
            if(b<mx && a!=c){
                if(num[a]==1||num[c]==1||f[a][c]>1){
                    mx=min(b,mx);
                }
                else{
                    f[a][c]--;
                    f[c][a]--;
                    memset(ma,0,sizeof(ma));
                    dfs(a);
                    if(ma[c])mx=min(mx,b);
                    f[c][a]++;
                    f[a][c]++;
                }
            }
        }
        //cout<<"mx = "<<mx<<endl;
    
        for(int i=1;i<=4;i++)solve(i);
    
        printf("%d
    ",ans);
    
    
        return 0;
    }
  • 相关阅读:
    Natas29 Writeup(Perl命令注入、00截断、绕过过滤)
    Natas27 Writeup(mysql溢出截断漏洞)
    Natas26 Writeup(PHP反序列化漏洞)
    Natas25 Writeup(目录遍历、头部注入)
    Natas24 Writeup(strcmp绕过漏洞)
    yum提示Another app is currently holding the yum lock; waiting for it to exit
    linux网站
    fastdfs_5.05下载
    sqlog连接虚拟机mysql服务
    java知识博客网站(一些配置和学习的记录)
  • 原文地址:https://www.cnblogs.com/wa007/p/9610991.html
Copyright © 2011-2022 走看看