题目中对二分图的定义十分特殊, 指的是 U,V两部分中,U的顶点度数必定为2,V中顶点无限制。

题目要求的是 对于所有匹配,该匹配的权值=该匹配中选中的边的边权的乘积,求所有匹配权值之和。

对于V中的顶点,a∈V , 如果a的度数为1, 那么a的最优匹配就已经决定了,此时将a对答案的贡献记录下来(ans乘上该边的权即可,因为任意一种匹配都必定包含此边)。

删去a点后,所有与a相连的顶点度数-1,如果这个时候又出现了度数为1的顶点,就重复类似a的操作,直到图中再无度数为1的顶点。

可以发现,这就是无向图判环的一种方法。剩下的顶点度数必定为2(题目中的特殊条件限制),且构成x个环。

对于每个环我们可以发现

都会只有两种取法使得最优匹配,这种跳着取边算贡献的过程我们可以用dfs实现。

题目中,一种 最优匹配的权值 是 最优匹配中所有边的乘积,所以对于一个环,我们算出 Sum蓝色=∏蓝色边  Sum红色=∏红色边

计算(Sum蓝色+Sum红色)与当前的ans相乘即可,因为任意 两个之间的最优匹配都可以随意配对 比如 环a红色配环b蓝色, 环a蓝色配 环b蓝色...

/*hdu6073[dfs+删边] 2017多校4*/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD = 998244353LL;
struct Edge {
int to, cost;
Edge(int T = , int C = )
: to(T), cost(C) {}
};
vector<Edge>G[];
int deg[];
bool vis[];
int T, n, u, v, w;
LL x = , y = ;
LL res = , ans = ;
void init() {
res = , ans = ;
for (int i = ; i <= * n; i++) {
G[i].clear();
}
memset(deg, , sizeof(deg));
memset(vis, , sizeof(vis));
}
void dfs(int u, int fa, int c) {
if (vis[u]) return;
vis[u] = ;
for (int i = ; i < (int)G[u].size(); i++) {
Edge &e = G[u][i];
if (e.to == fa || deg[e.to] != ) continue;
dfs(e.to, u, c ^ );
if (c) x = (x * e.cost) % MOD;
else y = (y * e.cost) % MOD;
break;
}
return;
}
void solve() {
queue<int>q;
for (int i = ; i <= * n; i++) {
if (deg[i] == ) {
q.push(i);
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
deg[u]--;
for (int i = ; i < (int)G[u].size(); i++) {
Edge &e = G[u][i];
deg[e.to]--;
if (!vis[e.to] && !vis[u]) {
vis[e.to] = vis[u] = ;
res = (res * e.cost) % MOD;
}
if (deg[e.to] == ) {
q.push(e.to);
}
}
}
memset(vis, , sizeof(vis));
for (int i = ; i <= * n; i++) {
if (deg[i] == && !vis[i]) {
x = , y = ;
dfs(i, i, );
//cout << x << ' ' << y << endl;
ans = (ans * (x + y)) % MOD;
}
}
ans = (ans * res) % MOD;
printf("%lld\n", ans);
}
int main() {
//freopen("1007.in", "r", stdin);
//freopen("1007.txt", "w", stdout);
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
init();
for (int i = ; i <= n; i++) {
scanf("%d%d", &v, &w);
G[i].push_back(Edge(v + n, w));
G[v + n].push_back(Edge(i, w));
deg[i]++, deg[v + n]++;
scanf("%d%d", &v, &w);
G[i].push_back(Edge(v + n, w));
G[v + n].push_back(Edge(i, w));
deg[i]++, deg[v + n]++;
}
solve();
}
return ;
}

hdu6073[dfs+删边] 2017多校4的更多相关文章

  1. hdu6035[dfs+思维] 2017多校1

    /*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...

  2. hdu6060[贪心+dfs] 2017多校3

    /* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...

  3. 2017 多校1 I Curse Myself

    2017 多校2 I Curse Myself(第k小生成树) 题目: 给一张带权无向连通图,该图的任意一条边最多只会经过一个简单环,定义\(V(k)为第k小生成树的权值和\),求出\(\sum_{k ...

  4. 2017 多校5 hdu 6093 Rikka with Number

    2017 多校5 Rikka with Number(数学 + 数位dp) 题意: 统计\([L,R]\)内 有多少数字 满足在某个\(d(d>=2)\)进制下是\(d\)的全排列的 \(1 & ...

  5. 2017 多校5 Rikka with String

    2017 多校5 Rikka with String(ac自动机+dp) 题意: Yuta has \(n\) \(01\) strings \(s_i\), and he wants to know ...

  6. 2017 多校4 Security Check

    2017 多校4 Security Check 题意: 有\(A_i\)和\(B_i\)两个长度为\(n\)的队列过安检,当\(|A_i-B_j|>K\)的时候, \(A_i和B_j\)是可以同 ...

  7. hdu6038[找规律+循环节] 2017多校1

    /*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL ...

  8. hdu6074[并查集+LCA+思维] 2017多校4

    看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...

  9. 2017 多校4 Wavel Sequence

    2017 多校4 Wavel Sequence 题意: Formally, he defines a sequence \(a_1,a_2,...,a_n\) as ''wavel'' if and ...

随机推荐

  1. VS2010每次编译都重新编译 解决方案

    今天用VS2010的时候遇到这个问题,总搞不定,关掉重启各种尝试都木有用,最后突然发现项目的生成时间总是2009年...好吧,原来刚才笔记本死机了,我把笔记本拆了,拔下电池,擦了擦内存条,导致系统时间 ...

  2. Android LitePal介绍与使用说明

    LitePal for Android LitePal是一个Android开源库,它使开发者使用SQLite数据库变得非常容易. 你可以不用写一句SQL语句就可以完成大部分数据库操作,包括创建表,更新 ...

  3. Genymotion的安装与设置

    Genymotion是一款非常好用的虚拟机,利用它可以在window.Liunx或MAC系统上实现Android的模似器.对于开发人员来说,有了Android模似器,就可以在电脑上实时调试安卓app, ...

  4. 浏览器对DIV+CSS兼容性问题大总结

    浏览器对DIV+CSS兼容性问题大总结 接触DIV+CSS架构已经快两年了,个人觉得css入门不难,但要学精并非一朝一夕的,现在大部分网络公司都比较主张用div+css来布局,这就面临着一个比较难的问 ...

  5. windows 操作系统种类

    @hcy 敬请访问:http://blog.sina.com.cn/iihcy Microsoft公司从1983年开始研制Windows系统,最初的研制目标是在MS-DOS的基础上提供一个多任务的图形 ...

  6. The Singapore NRIC Check Digit

    The Singapore NRIC number is made up of 7 digits and a letter behind. This letter is calculated from ...

  7. 在Ubuntu16.04安装YouCompleteMe

    作为从事了4年多嵌入式Linux工作的软件工程师,最近决定完全在ubuntu上工作,使用vim进行代码的阅读和编辑,然后尝试去安装vim相关的各种插件.从来没用过代码补全的我,在网上找到了插件omni ...

  8. (转)MyBatis框架的学习(六)——MyBatis整合Spring

    http://blog.csdn.net/yerenyuan_pku/article/details/71904315 本文将手把手教你如何使用MyBatis整合Spring,这儿,我本人使用的MyB ...

  9. tensorflowjs下载源文件到本地不能加载模型解决方案

    大多数情况(非源文件错误)下载源文件到本地不能加载模型,那么你可能需要搭建一个本地WEB服务器. 1.安装apache或ngnix,可以参照这个博客 2.强烈推荐一个Chrome插件Web Serve ...

  10. A. Pride (emmmm练习特判的好题)

    题目连接 : http://codeforces.com/problemset/problem/891/A You have an array a with length n, you can per ...