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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Code Names

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Code Names 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Code Names

題意:

如果一個字符串通過交換兩個位置可以得到另一個字符串(也就是兩個字符串只有兩個位置不一樣且為交換關系),我們稱這兩個字符串為替代關系。
現在給出n個字符串,求一個集合,使得集合內的字符串均不是交換關系,且使得這個集合最大

題解:

現在給每個字符串一個編號
如果兩個字符串i和j成替代關系,我們就從i到j連一條線
這樣將n個字符串互相連線,我們就得到一個圖,接下來該怎么辦?
我們知道連線的字符串是不能在一個集合里的
我們將左右側都為n個字符串,根據關系連線,得到下圖(紫色線)

這是個二分圖,我們在這個二分圖上跑最大二分匹配即可,跑出來的結果m就是不能匹配的數量,最大獨立集數就是n ? m,
(注意,我們一開始令ans=n*2,讓ans減去m,最后除以2是答案)
補充一些關系:
獨立集:圖中兩點不相鄰就是圖的一個獨立集
最大獨立集 = n - 最大匹配
最大匹配 = 最小點覆蓋
最大獨立集 = n - 最小點覆蓋
最大團 = 補圖的最大獨立集
最大獨立集 = 補圖的最大團

代碼:

#include<bits/stdc++.h> typedef long long ll; using namespace std; inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } const int maxn=6e2+9; string a[maxn]; int ans=0; bool vis[maxn]; int edge[maxn][maxn]; int fa[maxn]; int n; bool find(int x){if(vis[x])return 0;vis[x]=1;for(int i=1;i<=n;i++){if(edge[x][i]){if(fa[i]==0||find(fa[i])){fa[i]=x;return 1;}}} return 0; } int main() {cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}int len=a[1].length();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){int num=0;for(int k=0;k<len;k++){if(a[i][k]!=a[j][k])num++;}if(num==2)edge[i][j]=1;}}ans=n*2;for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));ans-=find(i); }cout<<ans/2; }

總結

以上是生活随笔為你收集整理的Code Names的全部內容,希望文章能夠幫你解決所遇到的問題。

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