日韩性视频-久久久蜜桃-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卡牌配对——最大流+建图优化的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 天堂中文网在线 | 91喷水视频 | 性生交大片免费看视频 | 狠色综合7777夜色撩人 | 天堂√ | 伊人院| 欧美精品黑人猛交高潮 | 国产精品系列在线 | 级毛片 | 波多野结衣av一区二区全免费观看 | 波多野 在线 | 影音先锋婷婷 | 欧美一区二区三区影院 | 欧美日韩精品一区二区在线播放 | 男人和女人插插 | 欧美精品久久久久性色 | 国产男女网站 | 99久久久无码国产精品性 | 午夜视频导航 | 一起射导航 | 婷婷九月 | 国产成人精品无码播放 | 亚洲欧美日韩一区二区三区四区 | 欧美一级在线播放 | 99久久一区二区 | 色噜噜狠狠狠综合曰曰曰 | 欧美成人三级视频 | 成人精品黄段子 | 激情丁香六月 | 欧美大片在线免费观看 | 蜜桃视频色 | 精品国产99一区二区乱码综合 | 日本天堂网在线 | 国内一级黄色片 | 香蕉成视频人app下载安装 | 51国产在线| 草莓视频一区二区三区 | 亚洲人交配视频 | 91久久精品日日躁夜夜躁欧美 | 黄色国产片| 欧美激情片在线观看 | 免费视频网站在线观看入口 | 亚洲成人午夜在线 | 国产日产亚洲精品 | 中文字幕一区二区不卡 | 特级毛片在线 | cekc老妇女cea0 | 91在线一区二区三区 | 久久偷看各类女兵18女厕嘘嘘 | 黄色资源网站 | 总裁憋尿呻吟双腿大开憋尿 | 国产免费无码一区二区视频 | 欧美视频一区二区三区在线观看 | 香蕉久草| 激情内射亚洲一区二区三区爱妻 | 日韩成人午夜 | 人人妻人人澡人人爽人人精品 | 欧美日韩高清一区二区 国产亚洲免费看 | 操操日日 | 日韩欧美中文字幕在线观看 | 丁香花电影高清在线阅读免费 | www在线| 久久av资源 | 久久精品免费在线观看 | 欧美一卡二卡在线 | 国产成人在线观看网站 | 久久亚洲私人国产精品va | 干美女少妇| 久久av网站 | 欧美久操 | 激情丁香 | 日本一本不卡 | 97人人爽人人 | 国产精品91在线 | 波多野结衣亚洲 | 日本少妇吞精囗交视频 | 欧美 唯美 清纯 偷拍 | 综合在线播放 | 欧美三级网站在线观看 | 亚洲成a人片77777kkkk | 青青草原亚洲 | 久久久久色 | 伊人影院久久 | 五月婷婷激情综合网 | 天堂资源中文在线 | 日韩在线播放中文字幕 | 老外一级黄色片 | 亚洲最新av网站 | av片亚洲| 丁香四月婷婷 | 久色网| 性中国古装videossex | 97免费视频观看 | 欧美做受高潮中文字幕 | 台湾佬美性中文网 | 午夜免费体验区 | 亚洲伊人天堂 | 欧美激情在线观看视频 | 国产高清一区 |