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的点入队,删去 ...
随机推荐
- 关于Java的File类、字节流和字符流
一.File类: 在Windows下的路径分隔符(\)和在Linux下的路径分隔符(/)是不一样的,当直接使用绝对路径时,跨平台会报No Such file or diretory异常. File中还 ...
- Java笔记8:Hibernate连接Oracle
1下载hibernate-3.6.0 Final.zip到任意目录,解压缩后得到hibernate目录 2下载slf4j-1.7.13.zip到任意目录,解压缩后得到slf4j-1.7.13 3操作数 ...
- win下idea远程提交WordCount任务到HA集群
一,环境配置 1,修改win下的host文件:即C:\Windows\System32\drivers\etc\host中添加集群中机子的ip 2,win下hadoop,并为win的环境变量配置had ...
- 30分钟Git命令“从入门到放弃”
git 现在的火爆程度非同一般,它被广泛地用在大型开源项目中,但是初学者非常容易“从入门到放弃”,各种命令各种参数,天哪,宝宝要吓哭了.实际上新手并不需要了解所有命令的用途,学习是需要一个循序渐进的过 ...
- [Functional Programming Monad] Apply Stateful Computations To Functions (.ap, .liftA2)
When building our stateful computations, there will come a time when we’ll need to combine two or mo ...
- 常用HTML标签的全称及描述
常用HTML标签的英文全称及简单描述 HTML标签 英文全称 中文释义 a Anchor 锚 abbr Abbreviation 缩写词 acronym Acronym 取首字母的缩写词 addr ...
- 使div变成半透明的css样式
.layer { opacity:0.9; filter:alpha(opacity=90); zoom:1; }
- WebService 之 工作原理
一.Web Service基本概念 Web Service 也叫 XML Web Service,WebService 是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求 ...
- Struts2-Spring和Hibernate整合
Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到广泛的应用.作为最成功的Web框架,Struts自然拥有众多的优点:MVC 2模型的使用.功能齐全的标志库(Tag Libr ...
- Android 开发之使用Eclipse Debug调试详解(转)
转自 http://blog.csdn.net/xys289187120/article/details/6636331 1.在程序中添加一个断点 如果所示:在Eclipse中添加了一个程序断点 在E ...