第二场练习赛 | 赛后的一点感想

    // 好些天都没写题解报告和阶段性总结了,原因很简单,前段时间的图论部分太难全部消化掌握,几天时间都只理解了部分概念以及一点算法思想。

    // 本想暂时把图论放放,结果紧跟着网络流,就完全跟不上进度,勉强补补前面的题。。。今天组队赛最后看题解居然发现直接出了网络流的原题,这下真逼我好好对待了。

    本场比赛AC题数(6/13)还可以,多亏两位队友在开场后不久猛地交题一路AC,而我只帮忙改改小错,水了两题。后来大部分时间三个人都分别专注于自己的题,遗憾的就是最后我们竟然再一题都没AC了。

    今天的K题(HDU 5889)我完全没想到是最大流问题,耗费了大量时间自己暴力bfs,又联想起前两天刚学的树状dp,写好后交了两发WA。后来跟Yu交流后才正确理解了题意,在那一个劲地思考求解每个点的入度。到最后放弃才去转向做另一题。而吃亏也在这题上,Wu最先就有想法,经过我提醒特殊情况后大概也懂了怎么去做,然后埋头用链式前向星写去了。。。而我很快用邻接矩阵写了初稿,还剩自环没有处理,也没有理解清楚,碰运气去交试试又是运行错误又是内存超限的。。。哎。。。晚上我们在路上总结当时首先要互相交流一下解法,然后要分配好时间。这里也替Yu惋惜一下用了别人模板也没顺利解决K题,当然也感谢他贡献了最多AC题数,飞太快我都一下跟不上了Orz...我还要尽力别拖后腿~~

    赛后讨论Wu过的F题:The Best Path代码:

  // &1判断奇数是我的部分,%2判断奇数就是Wu改过AC的。

#include <cstdio>
#include <vector>
#include <cstring
using namespace std;
const int maxn = 100010;
int n, m, val[maxn], degree[maxn];
vector<int> vec[maxn];
bool vis[maxn];
void dfs(int u)
{
    vis[u] = 1;
    for(int i=0;i<vec[u].size();i++)
        if(!vis[vec[u][i]])
            dfs(vec[u][i]);
}
bool connect()
{
    for(int i=1;i<=n;i++) if(!vis[i])dfs(i);
    for(int i=1;i<=n;i++)
        if(!vis[i]) return false;
    return true;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        memset(degree, 0, sizeof(degree));
        memset(vis, 0, sizeof(vis));
        for(int i=1;i<=n;i++) vec[i].clear();
        scanf("%d %d", &n, &m);
        for(int i=1;i<=n;i++) scanf("%d", &val[i]);
        int u, v;
        for(int i=1;i<=m;i++)
        {
            scanf("%d %d", &u, &v);
            vec[u].push_back(v);
            vec[v].push_back(u);
            degree[u]++, degree[v]++;
        }

        if(!connect()) { printf("Impossible\n"); continue; }
        int cnt = 0;
        for(int i=1;i<=n;i++)
            if(degree[i]&1) cnt++;
        if(cnt>2) { printf("Impossible\n"); continue; }
        int ans = 0;
        if(cnt!=0)
        {
            for(int i=1;i<=n;i++)
            {
                if((degree[i]+1)/2%2==1) ans^=val[i];
            }
            printf("%d\n", ans);
        }
        else
        {
            int sum=0;
            for(int i=1;i<=n;i++)
            {
                if(degree[i]/2%2==1) ans^=val[i];
            }
            for(int i=1;i<=n;i++)
                sum=max(sum,ans^val[i]);
            printf("%d\n", sum);
        }

    }
    return 0;
}

   

   贴一下刚回来搜到的K题题解:https://blog.csdn.net/L954688947/article/details/52564219

 "赤裸裸的最大流最小割

    现在想想都气啊,前些天怎么不好好学了。。。

    给明天挖坑,这次一定要总结消化目前的dp部分,没弄懂就是背板子也要把自己AC的题记下来0.0

    明日再更~~~

    

HDU 5889

猜你喜欢

转载自www.cnblogs.com/izcat/p/9478928.html