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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)

發(fā)布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

線性代數(shù)+圖論好題。

題目鏈接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168

(luogu) https://www.luogu.org/problemnew/show/P4100

題解: 首先有一個結(jié)論是,設(shè)矩陣\(C\)滿足\(CA=B\), 則\(A\)的第\(i\)行可以被\(B\)的第\(j\)行來替代當(dāng)且僅當(dāng)\(C_{j,i}\ne 0\).

這個的話就是一定要記住,矩陣初等變換的實質(zhì)就是給它左乘一個初等矩陣,然后就很好理解了。

那么\(CA=B\)可以推出\(CAA^{-1}=BA^{-1}, C=BA^{-1}\)

數(shù)學(xué)被各種吊打啊……

然后我們就在\(O(n^3)\)時間內(nèi)求出了對于每一個\(i,j\), \(A\)中第\(i\)行是否能被\(B\)中第\(j\)行替換

問題轉(zhuǎn)化成了,給一張二分圖,保證有完美匹配,求一個完美匹配使得\(A\)中的每個點(diǎn)在\(B\)中的匹配點(diǎn)構(gòu)成的排列的字典序最小。

這個東西,貌似必須用匈牙利算法。。先跑一邊隨便求出一個完美匹配,然后從\(1\)號到\(n\)號每個點(diǎn)再匹配盡量小的,如果能找到使當(dāng)前\(i\)號點(diǎn)更小,且不影響\(i\)號點(diǎn)前面的點(diǎn)的交錯路,那么就可以更新答案了。

時間復(fù)雜度\(O(n^3)\).

代碼

#include<cstdio> #include<cstdlib> #include<cstring> #include<cassert> #include<iostream> #define llong long long using namespace std;inline int read() {int x=0; bool f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=0;for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');if(f) return x;return -x; }const int N = 300; const int P = 942030731; llong quickpow(llong x,llong y) {llong cur = x,ret = 1ll;for(int i=0; y; i++){if(y&(1ll<<i)) {y-=(1ll<<i); ret = ret*cur%P;}cur = cur*cur%P;}return ret; } llong mulinv(llong x) {return quickpow(x,P-2);} struct Matrix {llong a[N+3][N+3]; int n;Matrix() {}Matrix(int _n) {n = _n; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) a[i][j] = 0ll;}void read(int _n){n = _n;for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%lld",&a[i][j]);}void write(){printf("%d\n",n);for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) printf("%lld ",a[i][j]); puts("");}}Matrix operator *(const Matrix &arg){Matrix ret = Matrix(n);for(int i=1; i<=n; i++){for(int k=1; k<=n; k++){for(int j=1; j<=n; j++){ret.a[i][j] = (ret.a[i][j]+a[i][k]*arg.a[k][j])%P;}}}return ret;}Matrix inv(){Matrix ret = Matrix(n); for(int i=1; i<=n; i++) ret.a[i][i] = 1ll;for(int i=1; i<=n; i++){if(a[i][i]==0){bool found = false;for(int j=i+1; j<=n; j++){if(a[j][i]){for(int k=1; k<=n; k++) {swap(a[i][k],a[j][k]),swap(ret.a[i][k],ret.a[j][k]);}found = true; break;}}if(found==false) {ret.a[0][0] = P; return ret;}}for(int j=i+1; j<=n; j++){llong coe = (P-a[j][i]*mulinv(a[i][i])%P)%P;for(int k=1; k<=n; k++){a[j][k] = (a[j][k]+coe*a[i][k])%P;ret.a[j][k] = (ret.a[j][k]+coe*ret.a[i][k])%P;}}}for(int i=1; i<=n; i++){llong coe = mulinv(a[i][i]);for(int j=1; j<=n; j++) {a[i][j] = a[i][j]*coe%P; ret.a[i][j] = ret.a[i][j]*coe%P;}} // write(); // ret.write();for(int i=n; i>=1; i--){for(int j=n; j>=i+1; j--){llong coe = (P-a[i][j]*mulinv(a[j][j])%P)%P;a[i][j] = 0ll;for(int k=1; k<=n; k++) ret.a[i][k] = (ret.a[i][k]+coe*ret.a[j][k])%P;}}return ret;} } a,b,aux,c; int g[N+3][N+3]; int vis[N+3]; int match1[N+3],match2[N+3]; int n;bool dfs1(int u) {for(int i=1; i<=n; i++){if(g[i][u]==true && vis[i]==false){vis[i] = true;if(match2[i]==0 || dfs1(match2[i])==true){match2[i] = u; match1[u] = i;return true;}}}return false; }bool dfs2(int u,int u0) {for(int i=1; i<=n; i++){if(g[i][u]==true && vis[i]==false){vis[i] = true;if(match2[i]==u0 || (match2[i]>u0 && dfs2(match2[i],u0)==true)){match2[i] = u; match1[u] = i;return true;}}}return false; }int main() {scanf("%d",&n);a.read(n); b.read(n);aux = a.inv();if(aux.a[0][0]==P) {printf("NIE"); return 0;}c = b*aux;for(int i=1; i<=n; i++){for(int j=1; j<=n; j++) g[i][j] = c.a[i][j]==0 ? 0 : 1;} // for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) printf("%d",g[i][j]); puts("");}int mf = 0;for(int i=1; i<=n; i++){for(int j=1; j<=n; j++) vis[j] = false;mf += dfs1(i);}if(mf<n) {printf("NIE"); return 0;}printf("TAK\n");for(int i=1; i<=n; i++){for(int j=1; j<=n; j++) vis[j] = false;dfs2(i,i);}for(int i=1; i<=n; i++) printf("%d\n",match1[i]);return 0; }

總結(jié)

以上是生活随笔為你收集整理的BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 永久免费未满视频 | 成熟的女同志hd | 丝袜诱惑一区 | 人人草人人澡 | 中文字幕精品久久久久人妻红杏ⅰ | 亚洲调教欧美在线 | 两口子交换真实刺激高潮 | 亚洲精品久久久久久久蜜桃 | 欧美乱妇日本无乱码特黄大片 | 精品欧美一区二区三区成人 | 3d动漫精品啪啪一区二区免费 | 在线视频成人 | 国产乱国产乱老熟300部视频 | 国产精品麻豆一区二区三区 | 亚洲av无码乱码在线观看富二代 | 欧美日韩一级视频 | 国产欧美一区二区三区鸳鸯浴 | 自拍偷拍亚洲精品 | 日韩一二三区视频 | a√在线视频 | 亚洲欧美国产一区二区三区 | 精品人妻一区二区三区久久夜夜嗨 | www.成人| 亚洲午夜精品久久 | 日日骚一区 | 女人裸体又黄 | 无码人妻精品一区二区三区99不卡 | 国产在线视频资源 | 91九色丨porny丨肉丝 | 91官网在线观看 | 人妻视频一区二区三区 | 二区免费视频 | 538国产精品视频一区二区 | 成人妇女淫片aaaa视频 | 中文字幕乱码亚洲精品一区 | 激情六月婷 | 欧洲熟妇的性久久久久久 | 涩涩网站入口 | 日本国产欧美 | 88久久精品无码一区二区毛片 | 六月婷婷综合网 | 成人av影视在线 | 国产精品理论片在线观看 | 人人妻人人爽人人澡人人精品 | 四虎国产精品永久免费观看视频 | 国产又粗又猛又爽又黄av | 精品人妻一区二 | 中文字幕日韩欧美一区二区 | 国模婷婷| 欧美性视频一区二区三区 | 色播导航 | 欧美在线观看一区 | 国产又黄又 | 欲色综合| 五月色婷婷综合 | 日本一级淫片1000部 | av在线资源网| 亚洲午码 | 亚洲午夜久久久久久久久久久 | 90岁肥老奶奶毛毛外套 | 成人3d动漫在线观看 | 蜜桃精品久久久久久久免费影院 | 天天操天天拍 | 国产视频成人 | 中文字幕亚洲一区二区三区五十路 | 国产精品久久久久久亚洲调教 | 色哟哟中文字幕 | av综合导航 | 国产一级一片免费播放放a 丁香六月色 | 九九热中文字幕 | 看黄色a级片 | 日本熟妇一区二区 | javxxx| 国产精品一区二区麻豆 | 手机看片欧美日韩 | 成人激情五月天 | 亚洲欧美日韩一区二区三区四区 | 丰满肥臀噗嗤啊x99av | 中文字幕高清 | 插入综合网 | 女女同性高清片免费看 | a视频免费| 91一区二区三区四区 | 青青草免费在线 | 日韩精品在线电影 | 国产一区视频在线观看免费 | www.av.cn| 九九热精品 | 婷婷影院在线观看 | 亚洲第三十七页 | 性欧美丰满熟妇xxxx性仙踪林 | www.日韩在线| 久久精品人人做人人爽 | 中文字幕第一页在线视频 | 流白浆视频| 中文字幕无码av波多野吉衣 | 艳妇臀荡乳欲伦交换电影 | 两个人做羞羞的视频 | 手机看片1024日韩 |