hdu6073 Matching In Multiplication 分析+拓扑序
Matching In Multiplication
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 787 Accepted Submission(s): 222

Little Q misunderstands the definition of bipartite graph, he thinks the size of U is equal to the size of V, and for each vertex p in U, there are exactly two edges from p. Based on such weighted graph, he defines the weight of a perfect matching as the product of all the edges' weight, and the weight of a graph is the sum of all the perfect matchings' weight.
Please write a program to compute the weight of a weighted ''bipartite graph'' made by Little Q.
In each test case, there is an integer n(1≤n≤300000) in the first line, denoting the size of U. The vertex in U and V are labeled by 1,2,...,n.
For the next n lines, each line contains 4 integers vi,1,wi,1,vi,2,wi,2(1≤vi,j≤n,1≤wi,j≤109), denoting there is an edge between Ui and Vvi,1, weighted wi,1, and there is another edge between Ui and Vvi,2, weighted wi,2.
It is guaranteed that each graph has at least one perfect matchings, and there are at most one edge between every pair of vertex.
2
2 1 1 4
1 4 2 3
/**
题目:hdu6073 Matching In Multiplication
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6073
题意: 思路:
首先如果一个点的度数为1,那么它的匹配方案是固定的,继而我们可以去掉这一对点。通过拓扑我们可以不断去掉所有度数为1的点。 那么剩下的图中左右各有m个点,每个点度数都不小于2,且左边每个点度数都是2,而右侧总度数是2m,因此右侧只能是每个点度数都是2。 这说明这个图每个连通块是个环,在环上间隔着取即可,一共两种方案。 时间复杂度O(n)。 */
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long LL;
#define lson L,m,rt<<1
typedef pair<int,int> P;
#define rson m+1,R,rt<<1|1
const int mod = ;
const double eps = 1e-;
const int N = 6e5+;
int cnt[N], vis[N];
int a[N], an, n;
LL ans;
vector<P>G[N];
queue<int> q;
int now;
void solve(int r,int f,LL &ansl,LL &ansr,int step)
{
for(int i = ; i < (int)G[r].size(); i++){
if(G[r][i].first!=f&&(vis[G[r][i].first]==||G[r][i].first==now)){
vis[G[r][i].first] = ;
if(step%==){
ansl = ansl*G[r][i].second%mod;
}else
{
ansr = ansr*G[r][i].second%mod;
}
if(G[r][i].first==now){///回到起点。
return ;
}else
return solve(G[r][i].first,r,ansl,ansr,step+);
}
}
}
/*
void input()
{
for(int i = 1; i <= n; i+=2){
G[i].push_back(P(i+n,1));
G[i].push_back(P(i+n+1,1));
G[i+1].push_back(P(i+n,1));
G[i+1].push_back(P(i+n+1,1));
G[i+n].push_back(P(i,1));
G[i+n+1].push_back(P(i,1));
G[i+n].push_back(P(1+i,1));
G[i+n+1].push_back(P(1+i,1));
cnt[i+n]+=2;
cnt[i+n+1]+=2;
}
}*/
int main()
{
//freopen("C:\\Users\\accqx\\Desktop\\in.txt","r",stdin);
int T;
cin>>T;
int u1, w1, u2, w2;
while(T--)
{
scanf("%d",&n);
memset(cnt, , sizeof cnt);
memset(vis, , sizeof vis);
for(int i = ; i <= *n; i++) G[i].clear();
//input();
for(int i = ; i <= n; i++){
scanf("%d%d%d%d",&u1,&w1,&u2,&w2);
G[i].push_back(P(u1+n,w1));
G[i].push_back(P(u2+n,w2));
G[u1+n].push_back(P(i,w1));
G[u2+n].push_back(P(i,w2));
cnt[u1+n]++;
cnt[u2+n]++;
}
ans = ;
while(!q.empty()) q.pop();
for(int i = n+; i <= n*; i++){
if(cnt[i]==){
q.push(i);
}
}
while(!q.empty()){
int r = q.front();
q.pop();
int len = G[r].size();
int pos;
for(int i = ; i < len; i++){
if(vis[G[r][i].first]==){
vis[G[r][i].first] = ;
ans = ans*G[r][i].second%mod;
pos = G[r][i].first;
break;
}
} len = G[pos].size();
for(int i = ; i < len; i++){
if(G[pos][i].first!=r){
cnt[G[pos][i].first]--;
if(cnt[G[pos][i].first]==){
q.push(G[pos][i].first);
}
}
}
}
LL ansl, ansr;
for(int i = ; i <= n; i++){
if(vis[i]==){
now = i;
vis[i] = ;
ansl = ansr = ;
solve(i,-,ansl,ansr,);
ans = ans*(ansl+ansr)%mod;
}
}
printf("%lld\n",ans);
}
return ;
}
hdu6073 Matching In Multiplication 分析+拓扑序的更多相关文章
- 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(拓扑排序+思维)
http://acm.hdu.edu.cn/showproblem.php?pid=6073 题意:有个二分图,左边和右边的顶点数相同,左边的顶点每个顶点度数为2.现在有个屌丝理解错了最佳完美匹配,它 ...
- HDU 6073 Matching In Multiplication dfs遍历环 + 拓扑
Matching In Multiplication Problem DescriptionIn the mathematical discipline of graph theory, a bipa ...
- [正经分析] DAG上dp两种做法的区别——拓扑序与SPFA
在下最近刷了几道DAG图上dp的题目. 要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点. 第二道是洛谷上的NOI导刊题目<最长路 ...
- HDU 6073 - Matching In Multiplication | 2017 Multi-University Training Contest 4
/* HDU 6073 - Matching In Multiplication [ 图论 ] | 2017 Multi-University Training Contest 4 题意: 定义一张二 ...
- 2017 多校4 Matching In Multiplication(二分图)
Matching In Multiplication 题解: 首先如果一个点的度数为1,那么它的匹配方案是固定的,继而我们可以去掉这一对点.通过拓扑我们可以不断去掉所有度数为1的点. 那么剩下的图中左 ...
- 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)
3832: [Poi2014]Rally Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 168 Solved: ...
- BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)
无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory L ...
- hdu5438(2015长春赛区网络赛1002)拓扑序+DFS
题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...
随机推荐
- 几个免费的DNS地址
百度CDN 180.76.76.76 114.114.114.114 阿里CDN 223.5.5.5 223.6.6.6 googleCDN 8.8.8.8 国内外DNSserver地址列表 http ...
- TestNG 五 运行TestNG
一.并行运行于超时 可以通过在suite标签中使用 parallel 属性来让测试方法运行在不同的线程中.这个属性可以带有如下这样的值: <suite name="My suite&q ...
- vue - static(.gitkeep)
描述:git上传忽略的文件,与.gitnoignore一样.
- SSH框架之Struts(4)——Struts查漏补缺BeanUtils在Struts1中
在上篇博客SSH框架之Struts(3)--Struts的执行流程之核心方法,我们提到RequestProcessor中的processPopulate()是用来为为ActionForm 填充数据.它 ...
- 算法笔记_055:蓝桥杯练习 Tricky and Clever Password (Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好 ...
- 在LoadRunner中查找和替换字符串
参考<Search & Replace function for LoadRunner>: http://ptfrontline.wordpress.com/2009/03/13/ ...
- 【Spring实战】—— 6 内部Bean
本篇文章讲解了Spring的通过内部Bean设置Bean的属性. 类似内部类,内部Bean与普通的Bean关联不同的是: 1 普通的Bean,在其他的Bean实例引用时,都引用同一个实例. 2 内部B ...
- js设置加载进度提示
CreateTime--2017年8月23日09:17:46Author:Marydon js设置加载进度提示 第一部分:CSS /*加载样式*/ .Loading { position: abs ...
- 04-spring-控制反转
使用myeclipse开发spring一个Demo. 第一步:新建一个web project. 第二步:安装spring开发的支持包. 安装后多了这几个东西 3,定义一个操作接口: package c ...
- Python-深入理解元类(metaclass)
1.使用 type 动态创建类(type 是一个类, 用来创建类对象的元类, 所以也可以继承) type("Person", (), {"name": &quo ...