题意:
有一个城镇,它的所有街道都是单行(即有向)的,并且每条街道都是和两个路口相连。同时已知街道不会形成回路。
可以在任意一个路口放置一个伞兵,这个伞兵会顺着街道走,依次经过若干个路口。
问最少需要投放几个伞兵,使得每个路口都被伞兵拜访过。并且要满足每个路口只能被一个伞兵拜访过。
思路:
裸DAG图的最小路径覆盖。
DAG图的最小路径覆盖数 = 节点数 - 二分图最大匹配
代码:
vector<int> graph[125]; int cx[125],cy[125]; bool bmask[125]; int n,m; int findPath(int u){ int L=graph[u].size(); rep(i,0,L-1){ int v=graph[u][i]; if(!bmask[v]){ bmask[v]=true; if(cy[v]==-1||findPath(cy[v])){ cy[v]=u; cx[u]=v; return 1; } } } return 0; } int MaxMatch(){ int ans=0; rep(i,1,n) cx[i]=cy[i]=-1; rep(i,1,n) if(cx[i]==-1){ mem(bmask,false); ans+=findPath(i); } return ans; } int T; int main(){ cin>>T; while(T--){ scanf("%d",&n); rep(i,1,n) graph[i].clear(); scanf("%d",&m); while(m--){ int a,b; scanf("%d%d",&a,&b); graph[a].push_back(b); } int dd=MaxMatch(); printf("%d\n",n-dd); } }
时间: 2024-12-23 04:53:49