poj1422 Air Raid 最小路径覆盖=顶点数-最大匹配数
这是一道最小路径覆盖的题目,做最小路径的题目会有一个拆点的操作出现,我这里的拆点操作顺带做好了,并不是很明显,poj3020就很清楚了;
给个poj3020的博客,拆点操作写的很详细 http://blog.csdn.net/lyy289065406/article/details/6647040,这里的拆点操作讲的很好的,大神嘛就是不一样
接下来给一个 链接 是这道题目也就是poj1422的另一个人的博客,他的那个做法 把拆点表现的比较明显 http://blog.csdn.net/wangjian8006/article/details/7965213,也是个大神,他把拆点那里的操作表现的很明显
接下来贴一下我的做法
题意:有n个点和m条有向边,现在要在点上放一些伞兵,然后伞兵沿着图走,直到不能走为止
每条边只能是一个伞兵走过,问最少放多少个伞兵
#include<iostream>#include<cstdio>#include<list>#include<algorithm>#include<cstring>#include<string>#include<queue>#include<stack>#include<map>#include<vector>#include<cmath>#include<memory.h>#include<set>#define ll long long#define LL __int64#define eps 1e-8const ll INF=9999999999999;using namespace std;#define M 400000100#define inf 0xfffffff//vector<pair<int,int> > G;//typedef pair<int,int> P;//vector<pair<int,int>> ::iterator iter;////map<ll,int>mp;//map<ll,int>::iterator p;vector<int>G[1212];char tempmp[1212][1212];int mp[1212][1212];int marry[1212];bool vis[1212];int dis[2][4]={0,-1,0,1,1,0,-1,0};int n,m;void clear(){memset(marry,-1,sizeof(marry));memset(mp,0,sizeof(mp));/*for(int i=0;i<1012;i++)G[i].clear();*/}bool dfs(int x){for(int i=1;i<=n;i++){if(mp[x][i] && !vis[i]){vis[i]=true;if(marry[i]==-1 || dfs(marry[i])){marry[i]=x;return 1;}}}return 0;}int main(void){int t;cin>>t;while(t--){clear();cin>>n>>m;int u,v;for(int i=0;i<m;i++){cin>>u>>v;mp[u][v]=1;}int ans=0;for(int i=1;i<=n;i++){memset(vis,false,sizeof(vis));if(dfs(i))ans++;}cout<<n-ans<<endl;//最小路径覆盖=顶点数-最大匹配数}}