-
F - Plug It In
- Gym - 101873F
- 题意:
- n个电器m个插头一个可以把单插头变为三岔的工具。
- 暴力尝试所有插头变三个会超时,
- 二分匹配 先对所有一个的插头进行匹配
- 对匹配结果进行克隆。
- 然后依次对每个型号的插头增加两个对新增加的两个进行匹配大大减小了时间。
- 注意是对插头匹配电器才容易依次增加两个。而且可以记录一下那些插头超过一个电器使用
- 才有必进行增加操作减少时耗。
- 匹配 匈牙利算法即可,
-
#include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; #define maxn 1555 int n,m,net[maxn],cp[maxn]; int in[maxn],k,u,v,ans,sum,cnt; vector<int>gra[maxn]; bool vis[maxn]; bool dfs(int x) { for(int i=0; i<gra[x].size(); i++) { if(!vis[gra[x][i]]) { vis[gra[x][i]]=1; if(net[gra[x][i]]==0||dfs(net[gra[x][i]])) { net[gra[x][i]]=x; return true; } } } return false; } int main() { ios::sync_with_stdio(false); cin>>n>>m>>k; while(k--) { cin>>u>>v; gra[u].push_back(v); in[u]++; } for(int i=1; i<=n; i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } for(int i=1; i<=m; i++) cp[i]=net[i]; sum=cnt=0; for(int i=1; i<=n; i++) { if(in[i]>1) { for(int j=1; j<=m; j++) net[j]=cp[j]; for(int j=n+1; j<=n+2; j++) { gra[j].clear(); for(int q=0; q<gra[i].size(); q++) gra[j].push_back(gra[i][q]); } cnt=0; memset(vis,0,sizeof(vis)); if(dfs(n+1)) cnt++; memset(vis,0,sizeof(vis)); if(dfs(n+2)) cnt++; sum=max(cnt,sum); if(sum==2) break; } } cout<<ans+sum<<endl; }
Plug It In Gym -经典动态染色
最新推荐文章于 2019-09-01 11:03:24 发布