第二场练习赛 | 赛后的一点感想
// 好些天都没写题解报告和阶段性总结了,原因很简单,前段时间的图论部分太难全部消化掌握,几天时间都只理解了部分概念以及一点算法思想。
// 本想暂时把图论放放,结果紧跟着网络流,就完全跟不上进度,勉强补补前面的题。。。今天组队赛最后看题解居然发现直接出了网络流的原题,这下真逼我好好对待了。
本场比赛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
明日再更~~~