POJ-2060 Taxi Cab Scheme 最小路径覆盖(匈牙利)

来源:互联网 发布:linux安装源码包 编辑:程序博客网 时间:2024/05/17 10:05

锻炼一下自己的邻接表建图能力。。。然后就是套模板。

虽然还是不知道为什么最小路径覆盖=点数-最大二分图匹配。

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <queue>#include <algorithm>#include <vector>#define maxn 555using namespace std;int link[maxn];bool visit[maxn];int t,n,m;struct //taxi的各项数据 {int starttime;//预约时间 int x1,x2;int y1,y2;int endtime;}taxi[555];struct//邻接表 {int v,next;}edge[maxn*maxn];int edgehead[maxn];bool dfs(int k)//搜索增广路 {for(int i=edgehead[k];i!=0;i=edge[i].next){int v=edge[i].v;if(!visit[v]){visit[v]=1; if(link[v]==-1||dfs(link[v])) {                link[v]=k;                return true;}}}return false;}int hungary()//匈牙利 {int num=0;memset(link,-1,sizeof(link));//初始化 for(int i=1;i<=n;i++){memset(visit,0,sizeof(visit));if(dfs(i))//有增广路 {num++;//匹配数++ }}return num;}int main(){int h,m;scanf("%d",&t);while(t--){memset(edgehead,0,sizeof(edgehead));//初始化 int s=1;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d:%d",&h,&m);//差点不机智的用字符串慢慢算。。 taxi[i].starttime=h*60+m;//预约时间,换算成分钟 scanf("%d%d%d%d",&taxi[i].x1,&taxi[i].y1,&taxi[i].x2,&taxi[i].y2);taxi[i].endtime=taxi[i].starttime+abs(taxi[i].x1-taxi[i].x2) + abs(taxi[i].y1-taxi[i].y2);//做完这个单的时间 }for(int i=1;i<=n;i++)//搜索可以继续的下一单,加入邻接表 {for(int j=i-1;j>0;j--){ if(taxi[i].starttime>=taxi[j].endtime+abs(taxi[i].x1-taxi[j].x2)+abs(taxi[i].y1-taxi[j].y2)+1) {  edge[s].v =j;                     edge[s].next = edgehead[i];                     edgehead[i]=s++; }}}int ans=0;ans=hungary();//二分匹配 printf("%d\n",n-ans);//最小路径覆盖=点-最大二分匹配 }return 0;}


0 0