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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

YBTOJ:伞兵空降(二分图匹配)

發布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 YBTOJ:伞兵空降(二分图匹配) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 解析
  • 代碼

題目描述

有n個點和m條邊的有向無環圖,在這張圖上的某些點上空投傘兵,使傘兵可以走到圖上所有的點。
且每個點只能被一個傘兵走一次。問至少需要放多少傘兵。

解析

考慮一開始給每個點分配一個傘兵,最差就是這樣n個傘兵的情況
然后就是考慮如何減少傘兵
因為不可重,所以每個點只能與一個入度和一個出度合并
考慮把每個點割成入點和出點,就變成了二分圖最大匹配問題
直接匈牙利或網絡流即可

代碼

#include<bits/stdc++.h> using namespace std; const int N=305; #define ll long long ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();};return x*f; } int n,m,l; struct node{int from,to,nxt; }p[N*N*4]; int fi[N],cnt=-1; void addline(int x,int y){p[++cnt]=(node){x,y,fi[x]};fi[x]=cnt; } int vis[N],mat[N]; bool dfs(int x,int tim){if(vis[x]==tim) return false;vis[x]=tim;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(!mat[to]||dfs(mat[to],tim)){mat[to]=x;return true;}}return false; } int hungary(){int res=0;memset(vis,0,sizeof(vis));memset(mat,0,sizeof(mat));for(int i=1;i<=n;i++){if(dfs(i,i)){res++;//printf(" ok:%d\n",i);}}return res; } bool mp[155][155]; int main(){int T=read();while(T--){memset(fi,-1,sizeof(fi));cnt=-1;memset(mp,0,sizeof(mp));n=read();m=read();for(int i=1;i<=m;i++){int x=read(),y=read();mp[x][y]=1;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(mp[i][j]) addline(i+n,j),addline(j,i+n);} }int res=hungary();printf("%d\n",n-res);}return 0; } /**/

總結

以上是生活随笔為你收集整理的YBTOJ:伞兵空降(二分图匹配)的全部內容,希望文章能夠幫你解決所遇到的問題。

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