HDU 6073 - Matching In Multiplication | 2017 Multi-University Training Contest 4
/*
HDU 6073 - Matching In Multiplication [ 图论 ] | 2017 Multi-University Training Contest 4
题意:
定义一张二分图,U中每个节点和V中两个节点连边
完美匹配的权值为该匹配所有边的权值相乘
求所有完美匹配的权值之和
分析:
可以发现有些V中的点只能连唯一的U中的点
按拓扑排序思路将这些全部处理掉后,剩下的点构成一个个环
每个环有两种连线方式,间隔取边权
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 600005;
const LL MOD = 998244353;
struct Edge {
int v; LL w;
};
vector<Edge> G[N];
int vis[N];
int cnt[N];
int t, n;
LL ans;
queue<int> que;
LL s[2];
void dfs(int x, int pre, int p)
{
if (vis[x]) return;
vis[x] = 2;
for (const auto & e : G[x])
{
if (vis[e.v] == 1 || e.v == pre) continue;
s[p] = s[p] * e.w % MOD;
dfs(e.v, x, p^1);
break;
}
}
void solve()
{
for (int i = n+1; i <= 2*n; i++)
if (G[i].size() == 1) que.push(i);
ans = 1;
while (!que.empty())
{
int y = que.front(); que.pop();
vis[y] = 1;
for (const auto& e: G[y])
{
if (!vis[e.v])
{
vis[e.v] = 1;
ans = ans * e.w % MOD;
for (const auto & ee: G[e.v])
{
if (vis[ee.v]) continue;
cnt[ee.v]--;
if (cnt[ee.v] == 1) que.push(ee.v);
}
}
}
}
for (int i = 1; i <= n; i++)
{
if (!vis[i])
{
s[0] = s[1] = 1;
dfs(i, i, 0);
ans = ans * (s[0] + s[1]) % MOD;
}
}
}
void init(int n)
{
for (int i = 0; i <= n; i++) G[i].clear();
while (!que.empty()) que.pop();
memset(vis, 0, sizeof(vis));
memset(cnt, 0, sizeof(cnt));
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
init(n<<1);
for (int i = 1; i <= n; i++)
{
int v; LL w;
scanf("%d%lld", &v, &w); v += n;
G[i].push_back(Edge{v, w});
G[v].push_back(Edge{i, w});
cnt[v]++;
scanf("%d%lld", &v, &w); v += n;
G[i].push_back(Edge{v, w});
G[v].push_back(Edge{i, w});
cnt[v]++;
}
solve();
printf("%lld\n", ans);
}
}
HDU 6073 - Matching In Multiplication | 2017 Multi-University Training Contest 4的更多相关文章
- HDU 6073 Matching In Multiplication —— 2017 Multi-University Training 4
Matching In Multiplication Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K ( ...
- HDU 6073 Matching In Multiplication(拓扑排序)
Matching In Multiplication Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K ( ...
- HDU 6073 Matching In Multiplication dfs遍历环 + 拓扑
Matching In Multiplication Problem DescriptionIn the mathematical discipline of graph theory, a bipa ...
- 2017 ACM暑期多校联合训练 - Team 4 1007 HDU 6073 Matching In Multiplication (模拟)
题目链接 Problem Description In the mathematical discipline of graph theory, a bipartite graph is a grap ...
- HDU 6073 Matching In Multiplication(拓扑排序+思维)
http://acm.hdu.edu.cn/showproblem.php?pid=6073 题意:有个二分图,左边和右边的顶点数相同,左边的顶点每个顶点度数为2.现在有个屌丝理解错了最佳完美匹配,它 ...
- HDU 6162 - Ch’s gift | 2017 ZJUT Multi-University Training 9
/* HDU 6162 - Ch’s gift [ LCA,线段树 ] | 2017 ZJUT Multi-University Training 9 题意: N节点的树,Q组询问 每次询问s,t两节 ...
- HDU 4951 Multiplication table(2014 Multi-University Training Contest 8)
思路 如果进制为p 那么当x<p时 (p-1)*(p-x)=(p-(x+1)) *p +x 因为x<p 所以没有进位 所以高位上的数字为 p-(x+1). 根 ...
- 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。
/** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...
- 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟
/** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...
随机推荐
- 关于keepalived执行后日志狂刷IPVS: Can't initialize ipvs: Protocol not available的问题
安装了keepalived+lvs,达到了高可用的负载均衡,但是今天再启用的时候发现keepalived不正常,通过 /var/log/messages 查看系统日志发现狂刷 IPVS: Can't ...
- 缓存穿透 & 缓存雪崩 & 缓存击穿
一 缓存穿透 1. 行为 查询一个一定不存在的数据.存储层(姑且认为是db,下面都用db指代)查不到数据则不写入缓存,那么下次请求这个不存在的数据同样会到db层查询,失去了缓存的意义.流量大或人为恶意 ...
- LeetCode 答案(python)18-24
18.四个数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target ...
- [http]HTTP请求过程
我们在浏览器输入http://www.baidu.com想要进入百度首页,但是这是个域名,没法准确定位到服务器的位置,所以需要通过域名解析,把域名解析成对应的ip地址,然后通过ip地址查找目的主机.整 ...
- 【原创】大叔经验分享(76)confluence和jira配置
一 下载 confluence https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-conf ...
- JS基础_枚举对象中的属性
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 1 bootstrapValidator使用
1 如何使用 引入 <link href="bootstrapValidator.min.css" rel="stylesheet"> css文件 ...
- oracel数据泵导出导入
Oracle11g 使用数据泵导入/导出数据 expdp/impdp 目标:使用oracle数据泵,将A电脑上的数据库databaseA导出后,再导入到B电脑上的数据库databaseB中. A电脑上 ...
- excel中的更新链接
表格每次打开都提示是否更新连接 在 [ 数据 --> 编辑链接 ] 中也看到了这个连接 学着网上说的查找方式,去查找路径中包含的文字,文件名中包含的名字,都定位不到这个用了链接的单元格 ...
- LINUX 使用grep命令查看某个指定时间段的日志
今天查看订单重复的问题,由于订单生成已经有一段时间了,所以我必须精准进行日志查询.开始用的是sed 命令查询法,后来改成了grep查询,很方便. 命令: grep '时间' '日志文件名 ' 例如:我 ...