ZOJ 3156 Taxi 二分图+二分查找
2013-03-13 23:04
375 查看
题意:街道上有人和出租车,输入人和车的位置,然后计算所有人都上车的最短时间,每个人同时上车
做法:匈牙利算法直接...
做法:匈牙利算法直接...
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int LMT=102; double gra[LMT][LMT],chose[LMT*LMT],x[LMT<<1],y[LMT<<1],have; int xnum,ynum,cnt,link[LMT]; bool vis[LMT]; bool dfs(int i) { for(int j=0;j<ynum;j++) { if(gra[i][j]<=have&&!vis[ j ]) { vis[ j ]=true; if(link[ j ]==-1||dfs(link[ j ])) { link[ j ]=i; return true; } } } return false; } bool hu(void) { memset(link,-1,sizeof(link)); for(int i=0;i<xnum;i++) { memset(vis,0,sizeof(vis)); if(!dfs(i))return 0; } return 1; } double solve(void) { int l=0,r=cnt-1,m; double res=0; while(l<=r) { int m=(l+r)>>1; have=chose[m]; if(hu()) { res=have; r=m-1; } else l=m+1; } return res; } int main() { double v; int i; while(~scanf("%d%d",&xnum,&ynum)) { int i; cnt=0; memset(gra,-1,sizeof(gra)); for(i=0;i<xnum;i++) scanf("%lf%lf",&x[i],&y[i]); for(;i<xnum+ynum;i++) scanf("%lf%lf",&x[i],&y[i]); scanf("%lf",&v); for(int i=0;i<xnum;i++) for(int j=0;j<ynum;j++) { gra[i][j]=sqrt((x[i]-x[j+xnum])*(x[i]-x[j+xnum])+(y[i]-y[j+xnum])*(y[i]-y[j+xnum]))/v; chose[cnt++]=gra[i][j]; } sort(chose,chose+cnt); printf("%.2lf\n",solve()); } return 0; }
相关文章推荐
- ZOJ 3156 Taxi 二分二分图
- ZOJ 3156 Taxi (二分匹配+二分查找)
- ZOJ 3156 Taxi 二分二分图
- ZOJ 3156 Taxi (二分匹配+二分查找)
- ZOJ 2176 Speed Limit
- zoj 1047 (bfs)
- ZOJ 2699 Police Cities
- ZOJ Monthly, January 2018 - E Yet Another Data Structure Problem
- ZOJ 2913 Bus Pass(BFS+滚动队列)
- zoj 3537 Cake(三角划分dp+凸包)
- ZOJ 3662 Math Magic(12年长春现场赛 H)
- ZOJ 2516 Cells __栈模拟DFS__D__
- zoj 1514 Fake Tickets
- ZOJ 3620 Escape Time II
- ZOJ 2971 Give Me the Number
- zoj 2532 Internship【最小割】
- zoj 2099 Frame Polygonal Line
- ZOJ 2970 Faster, Higher, Stronger
- ZOJ 3203 Light Bulb
- ZOJ Problem Set - 3822Domination(DP)