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 ...
随机推荐
- 进程间通信,把字符串指针作为参数通过SendMessage传递给另一个进程,不起作用
参数发送进程: CString csCmd=AfxGetApp()->m_lpCmdLine; if (!csCmd.IsEmpty()) { pWndPrev->SendMessage( ...
- # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#
Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...
- {ubuntu}乱七八糟重命名为1 2 3.....png
i=; for f in *.png; do mv "$f" ${i}.png; ((i++)); done 网上找了个测试的数据集,发现读取时候,要重命名一下 一片帖子问了类似的 ...
- 一样的Java,不一样的HDInsight大数据开发体验
大数据的热潮一直居高不下,每个人都在谈.你也许不知道,早些年这个领域可是有个非常「惹眼球」的段子: 1首先开始科普 什么是 HDInsight Azure HDInsight 是 Hortonwork ...
- Django之admin的使用及源码分析
一.admin组件使用 Django本身提供了基于 web 的管理工具.其管理工具是django.contrib的一部分,可在settings.py中的 INSTALLED_APPS 看到: INST ...
- Perl sendmail
introduction of sendmail example send mail to multi-receiver
- (一)maven之创建一个maven项目
为什么要使用Maven? 1. maven使用的是本地仓库存储jar,所有项目都会共用仓库中的同一份jar. 2. Spring core.jar必须同时引用版本兼容的common-logging ...
- Luogu P5351 Ruri Loves Maschera
先ORZ\(Owen\)一发.感觉是个很套路的题,这里给一个蒟蒻的需要特判数据的伪\(n\log^2 n\)算法,真正的两只\(\log\)的还是去看标算吧(但这个好想好写跑不满啊) 首先这种树上路径 ...
- 【原创】最有效解决IE8 position兼容性问题
看了网上的的帖子真是水的一塌糊涂,完全没有解决我和广大网友们的关于ie8下position兼容性问题. 网上有的技术我就不说了 ,大家自行搜索,我想说的重点是 ie8不支持html5的新标签.这是重点 ...
- NoSuchBeanDefinitionException: No qualifying bean of type 'com.bj186.ssm.mapper.EmployeeMapper' available: expected at least 1 bean which qualifies as autowire candidate
在搭建SSM spring springmvc mybatis整合的时候, 遇到了这个问题 说说我的问题吧!我在进行单元测试的时候,出现了这个错误,网上一查才知道是,配置文件中没有写扫描包信息.一看 ...