1. 程式人生 > >Codeforces Round #533 (Div. 2)E. Helping Hiasat_求最大獨立子集轉換求最大團

Codeforces Round #533 (Div. 2)E. Helping Hiasat_求最大獨立子集轉換求最大團

aik def ack .html ret ive code round name

題目鏈接:E. Helping Hiasat

題解:把夾在同一段1裏面的人互相連邊,然後問題就轉換為求最大獨立子集的大小,最大獨立子集大小等於補圖的最大團。最大圖不會的可以看這篇博客,我也是看這個的

#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#define pb push_back
#define ll long long
#define PI 3.14159265
#define
ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define eps 1e-7 using namespace std; const int N=50; const int mod=1e9+7; int n,m; int g[N][N]; map<string ,int >mp; vector<int>ve; int ret=0; int cnt[N],vis[N],ans; bool dfs(int u,int d) { for(int i=u+1;i<m;i++) {
if(d+cnt[i]<=ans)return 0; if(g[u][i]) { int j; for(j=0;j<d;j++)if(!g[i][vis[j]])break; if(j==d) { vis[d]=i; if(dfs(i,d+1))return 1; } } } if(d>ans) { ans
=d;return 1; } return false; } int maxclique() { ans=0; for(int i=m-1;i>=0;i--) { vis[0]=i; dfs(i,1); cnt[i]=ans; } return ans; } int main() { std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n>>m; for(int i=0;i<=n;i++) { int op; if(i!=n)cin>>op; else op=1; if(op==1) { for(int j=0;j<ve.size();j++) { for(int k=j+1;k<ve.size();k++) { g[ve[j]][ve[k]]=1,g[ve[k]][ve[j]]=1; //cout<<"SSS"<<endl; } } ve.clear(); } else { string s;cin>>s; if(mp.count(s)==0)mp[s]=ret++; ve.pb(mp[s]); } } for(int i=0;i<m;i++) for(int j=0;j<m;j++)g[i][j]^=1; cout<<maxclique()<<endl; }

Codeforces Round #533 (Div. 2)E. Helping Hiasat_求最大獨立子集轉換求最大團