日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ4205卡牌配对——最大流+建图优化

發布時間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ4205卡牌配对——最大流+建图优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

現在有一種卡牌游戲,每張卡牌上有三個屬性值:A,B,C。把卡牌分為X,Y兩類,分別有n1,n2張。 兩張卡牌能夠配對,當且僅當,存在至多一項屬性值使得兩張卡牌該項屬性值互質,且兩張卡牌類別不同。 比如一張X類卡牌屬性值分別是225,233,101,一張Y類卡牌屬性值分別為115,466,99。那么這兩張牌是可以配對的,因為只有101和99一組屬性互質。 游戲的目的是最大化匹配上的卡牌組數,當然每張卡牌只能用一次。

輸入

數據第一行兩個數n1,n2,空格分割。 接下來n1行,每行3個數,依次表示每張X類卡牌的3項屬性值。 接下來n2行,每行3個數,依次表示每張Y類卡牌的3項屬性值。

輸出

輸出一個整數:最多能夠匹配的數目。

樣例輸入

2 2
2 2 2
2 5 5
2 2 5
5 5 5

樣例輸出

2
【提示】
樣例中第一張X類卡牌和第一張Y類卡牌能配對,第二張X類卡牌和兩張Y類卡牌都能配對。所以最佳方案是第一張X和第一張Y配對,第二張X和第二張Y配對。
另外,請大膽使用漸進復雜度較高的算法!

提示

對于100%的數據,n1,n2≤ 30000,屬性值為不超過200的正整數

?乍一看就是一個簡單的二分圖最大匹配,枚舉任意兩個不同類的卡牌連邊即可,但光是枚舉的時間復雜度就爆炸了,何況還會跑$10^9$條邊的最大流。所以我們想辦法優化:先考慮兩張牌$A,B$屬性都分別不互質的情況(剩下兩種情況相同),我們找到$A$屬性是$x$的倍數、$B$屬性是$y$的倍數的所有點,在二分圖中間新建一個點然后將左右滿足要求的點都連向這個點,流量為$INF$,表示這些點之間都能互相匹配。這里的$x,y$顯然只需要枚舉質數即可,$200$之內的質數只有$46$個,所以對于一種情況只需要建$46*46$個點即可,總點數為$70000$。而$2*3*5*7>200$,所以每個數最多只有三個質因子,每個點最多連$3*3*3$條邊,總邊數為$2000000$,直接跑$dinic$即可。

#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> #define INF 0x3f3f3f3f #define ll long long using namespace std; int head[70000]; int to[4000000]; int next[4000000]; int val[4000000]; int d[70000]; int q[70000]; int back[70000]; int S,T; int n,m; int tot=1; int ans; int cnt; vector<int>v[210]; int s[210][210]; int a1[40000]; int b1[40000]; int c1[40000]; int a2[40000]; int b2[40000]; int c2[40000]; int prime[50]; int vis[210]; int num; void find() {for(int i=2;i<=200;i++){if(!vis[i]){prime[++cnt]=i;}for(int j=1;j<=cnt&&prime[j]*i<=200;j++){vis[i*prime[j]]=1;if(i%prime[j]==0){break;}}}for(int i=1;i<=200;i++){for(int j=1;j<=cnt;j++){if(i%prime[j]==0){v[i].push_back(j);}}}for(int i=1;i<=cnt;i++){for(int j=1;j<=cnt;j++){s[i][j]=++num;}} } void add(int x,int y,int v) {tot++;next[tot]=back[x];back[x]=tot;to[tot]=y;val[tot]=v;tot++;next[tot]=back[y];back[y]=tot;to[tot]=x;val[tot]=0; } bool bfs(int S,int T) {int r=0;int l=0;memset(d,-1,sizeof(d));q[r++]=T;d[T]=2;while(l<r){int now=q[l];for(int i=back[now];i;i=next[i]){if(d[to[i]]==-1&&val[i^1]!=0){d[to[i]]=d[now]+1;q[r++]=to[i];}}l++;}if(d[S]==-1){return false;}else{return true;} } int dfs(int x,int flow) {if(x==T){return flow;}int now_flow;int used=0;for(int &i=head[x];i;i=next[i]){if(d[to[i]]==d[x]-1&&val[i]!=0){now_flow=dfs(to[i],min(flow-used,val[i]));val[i]-=now_flow;val[i^1]+=now_flow;used+=now_flow;if(now_flow==flow){return flow;}}}if(used==0){d[x]=-1;}return used; } int dinic() {int res=0;while(bfs(S,T)){memcpy(head,back,sizeof(back));res+=dfs(S,0x3f3f3f3f);}return res; } int main() {find();scanf("%d%d",&n,&m);S=n+m+46*46*3+1;T=S+1;for(int i=1;i<=n;i++){scanf("%d%d%d",&a1[i],&b1[i],&c1[i]);}for(int i=1;i<=m;i++){scanf("%d%d%d",&a2[i],&b2[i],&c2[i]);}for(int i=1;i<=n;i++){add(S,i,1);int sz1=v[a1[i]].size();int sz2=v[b1[i]].size();for(int j=0;j<sz1;j++){for(int k=0;k<sz2;k++){add(i,n+m+s[v[a1[i]][j]][v[b1[i]][k]],INF);}}sz2=v[c1[i]].size();for(int j=0;j<sz1;j++){for(int k=0;k<sz2;k++){add(i,n+m+46*46+s[v[a1[i]][j]][v[c1[i]][k]],INF);}}sz1=v[b1[i]].size();for(int j=0;j<sz1;j++){for(int k=0;k<sz2;k++){add(i,n+m+2*46*46+s[v[b1[i]][j]][v[c1[i]][k]],INF);}}}for(int i=1;i<=m;i++){add(n+i,T,1);int sz1=v[a2[i]].size();int sz2=v[b2[i]].size();for(int j=0;j<sz1;j++){for(int k=0;k<sz2;k++){add(n+m+s[v[a2[i]][j]][v[b2[i]][k]],n+i,INF);}}sz2=v[c2[i]].size();for(int j=0;j<sz1;j++){for(int k=0;k<sz2;k++){add(n+m+46*46+s[v[a2[i]][j]][v[c2[i]][k]],n+i,INF);}}sz1=v[b2[i]].size();for(int j=0;j<sz1;j++){for(int k=0;k<sz2;k++){add(n+m+2*46*46+s[v[b2[i]][j]][v[c2[i]][k]],n+i,INF);}}}printf("%d",dinic()); }

轉載于:https://www.cnblogs.com/Khada-Jhin/p/10584701.html

總結

以上是生活随笔為你收集整理的BZOJ4205卡牌配对——最大流+建图优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久av影视 | 少妇搡bbbb搡bbb搡小说 | 熟女视频一区二区三区 | 欧美日韩中文字幕一区二区 | 黑人激情视频 | 九九热在线观看视频 | 五月天91| 久久久999国产精品 天堂av中文在线 | 一级黄网 | 亚洲一区二区三区人妻 | 中文字幕+乱码+中文乱 | 亚洲一区二区三区播放 | 欧美老熟妇一区二区三区 | 国产一线二线三线在线观看 | xxxx国产| 日韩h视频 | 欧美少妇性生活 | 丰满熟妇人妻中文字幕 | 国产视频一区二区三区在线播放 | 日韩av二区 | 综合 欧美 亚洲日本 | 97在线视频免费观看 | 免费人妻精品一区二区三区 | 亚洲一区二区三区久久久 | 欧美成人黄色小说 | 欧美亚洲综合久久 | 日韩成人av网址 | 中出白浆 | 欧美激情视频在线观看 | 国产男男一区二区三区 | 亚洲春色另类 | 日韩精品人妻一区 | 亚洲欧美日韩精品在线 | 91亚洲精华国产精华精华液 | 麻豆黄色一级片 | 国产高清免费av | 手机天堂av | 91成人短视频在线观看 | 99热伊人 | 91av视频免费观看 | 日韩色区 | 中国a毛片 | caoprom超碰| 精品国产18久久久久久二百 | 欧美另类激情 | 丰满秘书被猛烈进入高清播放在 | 国产精品美女久久久久av爽 | 亚洲手机视频 | 成人乱码一区二区三区av | 91爱爱视频 | 99产精品成人啪免费网站 | 男人添女人下部高潮全视频 | 天堂在线观看免费视频 | 夜夜操网| 特级黄色一级片 | 蜜桃视频一区二区三区 | 杨幂毛片午夜性生毛片 | 欧美鲁 | 亚洲三区精品 | 国产欧美一区二区三区鸳鸯浴 | 国产精品久久久久av | 哺乳喂奶一二三区乳 | 欧洲成人午夜精品无码区久久 | 午夜在线观看一区 | 精品人妻无码一区二区三区蜜桃一 | 古代黄色一级片 | 超碰资源总站 | 日本黄a三级三级三级 | 国产精品久久久久久亚洲色 | 欧美第一视频 | 国产精品免费久久久 | 日日夜夜狠狠爱 | 99久久网站 | 亚洲天堂中文在线 | 日韩有码视频在线 | 成人在线视频一区二区 | 扒开腿揉捏花蒂h | 成年人在线网站 | 日韩视频在线观看一区二区 | 枫可怜av| 99免费在线观看 | 成人午夜激情视频 | 久久99久久久久久 | 亚洲91精品 | 欧美一区二区在线观看 | 国产叼嘿视频在线观看 | 中文字幕日韩久久 | 国产精品一区视频 | 手机av不卡 | 日本精品三级 | 午夜av福利 | 久久99久久99精品免观看软件 | 撸撸在线视频 | 超碰伊人久久 | 国产69精品久久久久777 | 老司机久久精品视频 | 夜夜嗨老熟女av一区二区三区 | 日韩网站免费观看 | 日韩精品欧美激情 |