hdu6073[dfs+删边] 2017多校4
题目中对二分图的定义十分特殊, 指的是 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的更多相关文章
- hdu6035[dfs+思维] 2017多校1
/*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...
- hdu6060[贪心+dfs] 2017多校3
/* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...
- 2017 多校1 I Curse Myself
2017 多校2 I Curse Myself(第k小生成树) 题目: 给一张带权无向连通图,该图的任意一条边最多只会经过一个简单环,定义\(V(k)为第k小生成树的权值和\),求出\(\sum_{k ...
- 2017 多校5 hdu 6093 Rikka with Number
2017 多校5 Rikka with Number(数学 + 数位dp) 题意: 统计\([L,R]\)内 有多少数字 满足在某个\(d(d>=2)\)进制下是\(d\)的全排列的 \(1 & ...
- 2017 多校5 Rikka with String
2017 多校5 Rikka with String(ac自动机+dp) 题意: Yuta has \(n\) \(01\) strings \(s_i\), and he wants to know ...
- 2017 多校4 Security Check
2017 多校4 Security Check 题意: 有\(A_i\)和\(B_i\)两个长度为\(n\)的队列过安检,当\(|A_i-B_j|>K\)的时候, \(A_i和B_j\)是可以同 ...
- hdu6038[找规律+循环节] 2017多校1
/*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL ...
- hdu6074[并查集+LCA+思维] 2017多校4
看了标答感觉思路清晰了许多,用并查集来维护全联通块的点数和边权和. 用另一个up[]数组(也是并查集)来保证每条边不会被重复附权值,这样我们只要将询问按权值从小到大排序,一定能的到最小的边权和与联通块 ...
- 2017 多校4 Wavel Sequence
2017 多校4 Wavel Sequence 题意: Formally, he defines a sequence \(a_1,a_2,...,a_n\) as ''wavel'' if and ...
随机推荐
- C# 一维数组 冒泡排序
假设有个三个杯子 一个杯子中有一个紫色的乒乓球 一个没有 一个有红色乒乓球 杯子不能动 怎么把紫色和红色的调换呢 主要是先把紫色的放到空的杯子 在把红的放到紫色原来的杯子 再把 ...
- Clown without borders 2017/1/10
原文 You'll laugh, you'll cry It's aesy to imaginehow the activities of CWB produce many emotional and ...
- 查看Windows激活信息
使用 Windows + R组合快捷键打开运行命令框 1.运行: slmgr.vbs -dlv 可以查询到Win10的激活信息,包括:激活ID.安装ID.激活截止日期等信息. 2.运行: slmgr. ...
- 关于HTML5中Video标签无法播放mp4的解决办法
1.首先先排除掉代码问题.路径问题.浏览器不支持问题等常规问题,这些问题另行百度. <video width="500px" height="300px" ...
- Robot Framework(十) 执行测试用例——测试执行
3.2测试执行 本节描述如何执行从解析的测试数据创建的测试套件结构,如何在失败后继续执行测试用例,以及如何正常停止整个测试执行. 3.2.1执行流程 执行套房和测试 设置和拆卸 执行顺序 3.2.2继 ...
- Spring框架针对dao层的jdbcTemplate操作crud之query查询数据操作
查询目标是完成3个功能: (1)查询表,返回某一个值.例如查询表中记录的条数,返回一个int类型数据 (2)查询表,返回结果为某一个对象. (3)查询表,返回结果为某一个泛型的list集合. 一.查询 ...
- 使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
使用Auto Layout中的VFL(Visual format language)--代码实现自动布局 2014-12-09 10:56 编辑: zhiwupei 分类:iOS开发 来源:机智的新手 ...
- Bzoj 1085: [SCOI2005]骑士精神 (dfs)
Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...
- 【树形dp 最长链】bzoj1912: [Apio2010]patrol 巡逻
富有思维性的树形dp Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ a, ...
- linux中mysql自带同步
今天打算给一个做主备web服务器.考虑到数据库的同步,现在自己本地虚拟机做个实验. 经过慎重考虑(其实就是参考了下论坛大家的看法). 最后决定用mysql自带的同步设置. 话不多说 配置过程如下.