【图论】【二分图匹配】[POJ 1422]Air Raid
2015-07-28 15:50
399 查看
这道题目不用我说什么了吧,裸的最小路径覆盖问题(还有其他方法=》出门左转网络流)然后对于这道题目而言就是每一个点差点分成两个,一个进一个出,那么显然二分图匹配,每一个点只能一进一出,那么匹配出来的边的数量就是当前这个图上有多少条边可以缩成一个点,那么直接ans=|V|−ans′ans=|V|-ans'就好了。
[code]#include <cstdio> #include <cstring> #include <algorithm> //#include <conio.h> using namespace std; const int MAXN = 400; bool vis[MAXN+10]; int con[MAXN+10]; int endcnt; int n, m; struct node{ int v; node *next; }Edges[2000*2+10], *adj[MAXN+10], *ecnt=Edges; void addedge(int u, int v){ ++ecnt; ecnt->v = v; ecnt->next = adj[u]; adj[u] = ecnt; } bool dfs(int u){ for(node *p=adj[u];p;p=p->next){ if(!vis[p->v]){ vis[p->v] = true; if(con[p->v]==-1 || dfs(con[p->v])){ con[u] = p->v; con[p->v] = u; return true; } } } return false; } int work(){ int ret = 0; memset(con, -1, sizeof con); for(int i=1;i<=endcnt;i++) if(con[i] == -1){ memset(vis, 0, sizeof vis); ret += dfs(i); } return ret; } void read(){ int t1, t2; scanf("%d%d", &n, &m); for(int i=0;i<m;i++){ scanf("%d%d", &t1, &t2); addedge(t1, t2+n); addedge(t2+n, t1); } endcnt=n; } int main(){ int T; scanf("%d", &T); while(T--){ read(); printf("%d\n", n - work()); memset(adj, 0, sizeof adj); ecnt=Edges; } return 0; }
相关文章推荐
- 马尔可夫链及吉布斯抽样 入门详解(Markov Chain Monte Carlo and Gibbs Sampling)
- 1218THE DRUNK JAILER
- Snail—OC学习之文件操作(读写)
- GID SID AID HID
- 【问题及解决】Elasticsearch不能正常启动do not exists on master, act as master failure
- ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
- HDU 1151 Air Raid (最小路径覆盖)
- HDU 1151 Air Raid (最小路径覆盖)
- process launch failed: failed to get the task for process 1482
- 注意细节Attention To Detail之一:CSDN.NET网页的版权申明
- ontainer_of()宏
- aerospike与tair对比
- 修改git已提交的的author和email
- http://blog.csdn.net/jiajiayouba/article/details/9083757#comments
- ( linker command failed with exit code 1)错误总结
- samba错误:session setup failed: NT_STATUS_LOGON_FAILURE
- Async/Await 最佳做法
- service中AIDL的应用
- 2015 Multi-University Training Contest 3--1011 Work
- 那些没有root权限的岁月:一分钟解决mutt No mailbox