UVALive-3126 Taxi Cab Scheme (DAG的最小路径覆盖)
2015-11-06 12:12
453 查看
题目大意:要给n个人安排车,已知每个人的出发时间和起点与终点,问最少需要安排几辆车才能完成任务。
题目分析:最小路径覆盖。如果送完a到目的地后能在b出发之前赶来接b,那么连一条有向边a->b,最终将得到一个DAG。最少路径覆盖数便是答案。解法:把所有节点 i 拆成 i 和 i’,如果 i 和 j 之间连有一条边,那么则在二分图中连接 i->j’。最少路径覆盖数便是 n-最大匹配数。
代码如下:
题目分析:最小路径覆盖。如果送完a到目的地后能在b出发之前赶来接b,那么连一条有向边a->b,最终将得到一个DAG。最少路径覆盖数便是答案。解法:把所有节点 i 拆成 i 和 i’,如果 i 和 j 之间连有一条边,那么则在二分图中连接 i->j’。最少路径覆盖数便是 n-最大匹配数。
代码如下:
# include<iostream> # include<cstdio> # include<vector> # include<cstring> # include<algorithm> using namespace std; # define REP(i,s,n) for(int i=s;i<n;++i) # define CL(a,b) memset(a,b,sizeof(a)) # define CLL(a,b,n) fill(a,a+n,b) const int N=505; struct P { int t,sx,sy,ex,ey; }; P p ; int n,vis[N*2],link[N*2]; vector<int>G ,G1[N*2]; bool ok(int i,int j) { if(i==j) return false; int t=p[i].t+abs(p[i].ex-p[i].sx)+abs(p[i].ey-p[i].sy)+abs(p[i].ex-p[j].sx)+abs(p[i].ey-p[j].sy); return t+1<=p[j].t; } bool dfs(int x) { REP(i,0,G1[x].size()){ int y=G1[x][i]; if(vis[y]) continue; vis[y]=1; if(link[y]==-1||dfs(link[y])){ link[y]=x; return true; } } return false; } int match() { CL(link,-1); int res=0; REP(i,1,2*n+1){ CL(vis,0); if(dfs(i)) ++res; } return res; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); REP(i,1,n+1){ int a,b; scanf("%d",&a); getchar(); scanf("%d",&b); p[i].t=a*60+b; scanf("%d%d%d%d",&p[i].sx,&p[i].sy,&p[i].ex,&p[i].ey); } REP(i,1,n+1) G[i].clear(); REP(i,1,2*n+1) G1[i].clear(); REP(i,1,n+1) REP(j,1,n+1) if(ok(i,j)) G[i].push_back(j); REP(i,1,n+1) REP(j,0,G[i].size()) G1[i*2-1].push_back(G[i][j]*2); int ans=match(); printf("%d\n",n-ans); } return 0; }
相关文章推荐
- C++ Primer 学习笔记_21_函数 --函数定义、参数传递
- iOS中设计一个Block代码执行的UIAlertView
- Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法
- C++ Primer 学习笔记_20_语句(续) --break/continue/try,catch
- C++ Primer 学习笔记_19_语句 --if/switch/while/for语句
- Load JDBC Driver引起的死锁
- 利用c语言实现在一个3*3棋盘游戏
- C++ Primer 学习笔记_18_表达式(续2) --new/delete表达式与类型转换
- Android代码规范
- C++ Primer 学习笔记_17_表达式(续1) --箭头、条件、sizeof、逗号表达式与复合表达式求值
- asp.net mvc 中的模型绑定
- Java EE Containers
- 有效数字
- 验证过期 authorization has expired
- [NOIP 模拟]P老师的旅行 Spfa+树状数组
- iOS中UITableViewController自带的刷新控件
- hdu 5452 Minimum Cut
- MySQL创建用户与授权方法
- Redis常用命令操作
- Filter与Servlet的区别和联系