Matching In Multiplication

题解:

首先如果一个点的度数为1,那么它的匹配方案是固定的,继而我们可以去掉这一对点。通过拓扑我们可以不断去掉所有度数为1的点。

那么剩下的图中左右各有m个点,每个点度数都不小于2,且左边每个点度数都是2,而右侧总度数是2m,因此右侧只能是每个点度数都是2。这说明这个图每个连通块是个环,在环上间隔着取即可,一共两种方案。

时间复杂度O(n)。

比赛的时候已经想出做法了,然而实现的太慢了,时间不够了,最后看了题解才想到,哦,原来隔着取就好了,我还想着去求匹配,标记取边呢

讲道理,这个时间卡得真紧,我写的挫,用vector居然过不去,改成用数组建边,队列手写才过去

#include<bits/stdc++.h>
#define LL long long
#define P pair<int,int>
using namespace std;
const int mod = 998244353;
const int N = 1e6 + 10;
int read(){
int x = 0;
char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x;
}
struct Edge{
int v,w,nxt;
Edge(){};
}ee[N * 2];
int head[N],EN;
int n;
int d[N];
int vis[N];
int cnt;
int e[N];
int Q[N];
void add(int u,int v,int w){
ee[EN].v = v,ee[EN].w = w,ee[EN].nxt = head[u + n];
head[u + n] = EN++;
ee[EN].v = u + n,ee[EN].w = w,ee[EN].nxt = head[v];
head[v] = EN++;
}
void init(){
EN = 0;
for(int i = 1;i <= 2 * n;i++) {
vis[i] = d[i] = 0;
head[i] = -1;
}
}
void dfs(int u,int f){
vis[u] = 1;
bool flag = true;
int p;
for(int i = head[u];~i;i = ee[i].nxt){
if(ee[i].v != f) p = ee[i].w;
if(!vis[ee[i].v]){
e[cnt++] = ee[i].w;
flag = false;
dfs(ee[i].v,u);
}
}
if(flag){
e[cnt++] = p;
}
} int main(){ int T;
T = read();
while(T--){
n = read();
int u,v,w,v1,w1,v2,w2;
init();
for(int i = 1;i <= n;i++){
v1 = read(),w1 = read(),v2 = read(),w2 = read();
d[v1]++,d[v2]++;
add(i,v1,w1);
add(i,v2,w2);
}
int h = 0,t = 0;
LL ans = 1;
for(int i = 1;i <= n;i++){
if(d[i] == 1) Q[t++] = i;
}
while(h < t){
u = Q[h++];
for(int i = head[u];~i;i = ee[i].nxt){
if(vis[ee[i].v]) continue;
ans = ans * ee[i].w % mod, v = ee[i].v;
break;
}
vis[u] = vis[v] = 1;
for(int i = head[v];~i;i = ee[i].nxt){
if(!vis[ee[i].v] && --d[ee[i].v] == 1) Q[t++] = ee[i].v;
}
}
for(int i = 1;i <= n;i++){
if(!vis[i] && d[i] == 2){
cnt = 0;
dfs(i,-1);
LL res1 = 1,res2 = 1;
for(int j = 0;j < cnt;j+=2){
res1 = res1 * e[j] % mod;
res2 = res2 * e[j+1] % mod;
}
ans = ans * (res1 + res2) % mod ;
}
}
printf("%lld\n",ans);
}
return 0;
}

2017 多校4 Matching In Multiplication(二分图)的更多相关文章

  1. HDU 6073 - Matching In Multiplication | 2017 Multi-University Training Contest 4

    /* HDU 6073 - Matching In Multiplication [ 图论 ] | 2017 Multi-University Training Contest 4 题意: 定义一张二 ...

  2. 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 ( ...

  3. HDU 6073 Matching In Multiplication(拓扑排序)

    Matching In Multiplication Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K ( ...

  4. hdu6073[dfs+删边] 2017多校4

    题目中对二分图的定义十分特殊, 指的是 U,V两部分中,U的顶点度数必定为2,V中顶点无限制. 题目要求的是 对于所有匹配,该匹配的权值=该匹配中选中的边的边权的乘积,求所有匹配权值之和. 对于V中的 ...

  5. hdu6073 Matching In Multiplication 分析+拓扑序

    Matching In Multiplication Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K ( ...

  6. 2017 多校5 hdu 6093 Rikka with Number

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

  7. 2017 多校5 Rikka with String

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

  8. 2017 多校4 Wavel Sequence

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

  9. 2017 多校4 Security Check

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

随机推荐

  1. 第34-1题:LeetCode112. Path Sum I

    题目 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例:  给定如下二叉树,以及目标和 sum ...

  2. 【清真dp】cf1144G. Two Merged Sequences

    成就:赛后在cf使用错误的贪心通过一题 成就:在cf上赛后提交hack数据 成就:在cf上赛后hack自己 题目大意 有一长度$n \le 2\times 10^5$的序列,要求判断是否能够划分为一个 ...

  3. Java分享笔记:使用entrySet方法获取Map集合中的元素

    /*--------------------------------- 使用entrySet方法取出Map集合中的元素: ....该方法是将Map集合中key与value的关系存入到了Set集合中,这 ...

  4. 读键值对封装成Map

    描述: 有配置文件address_relation.properties,记录地址关系,有如下数据:ZSSS=ZS%,ZSPD, 封装到Map代码如下: public static void main ...

  5. PHP实现的一个时间帮助类

    背景 工作的过程中经常会遇到各种时间类的操作,因此封装了一个帮助工具类,提高代码的复用率 主要功能 根据相差的天数获取连续的时间段 /** * 根据相差的天数获取所有连续的时间段 * @param $ ...

  6. (servlet页面跳转没有反应)

    问题:页面跳转到/UserManager/LoginCLServlet,就一直没有反应,无法继续执行下去(servlet页面跳转没有反应) 解决: doPost()方法里面必须写成这样 正确的写法:  ...

  7. java-反射和代理

    1.类的编译和运行简易过程: java的源码文件(也称为编译单元,以.java为后缀的文件) ↓ 文件内最多只能有一个public修饰的类,否则编译器报错:某个类被public修饰,该类名必需与文件名 ...

  8. 平衡二叉查找树 AVL 的实现

    不同结构的二叉查找树,查找效率有很大的不同(单支树结构的查找效率退化成了顺序查找).如何解决这个问题呢?关键在于如何最大限度的减小树的深度.正是基于这个想法,平衡二叉树出现了. 平衡二叉树的定义 (A ...

  9. jquery 配合 ajax 完成 在线编辑 你值得拥有

    思路分析: 将 table中的表格 改变成为 input表格框获得值 ajax配合修改 删除 <?php use yii\helpers\Url; $web = Url::base(); ?&g ...

  10. jpeglib的使用

    1. 解压jpeglib tar xvzf libjpeg-turbo-1.2.1.tar.gz 2. 阅读里面的说明文件,得到jpeg解压缩的一般步骤: /*Allocate and initial ...