与POJ 3216类似,不过这道题两站之间的距离是曼哈顿距离,不要Floyd求最短距离 代码: #include<iostream> using namespace std; struct node { int start; int end; int a,b,c,d; }ride[500]; int m,g[505][505]; int link[505],u[505]; int dfs(int t) { for(int i=1;i<=m;i++) { if(g[t][i]&&!u[i]) { u[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=t; return 1; } } } return 0; } int hungary() { memset(link,-1,sizeof(link)); int i,num=0; for(i=1;i<=m;i++) { memset(u,0,sizeof(u)); num+=dfs(i); } return num; } int main() { int test,i,j,a,b,c,d,h,min; cin>>test; while(test--) { memset(g,0,sizeof(g)); scanf("%d",&m); for(i=1;i<=m;i++) { scanf("%d:%d %d%d%d%d",&h,&min,&ride[i].a,&ride[i].b,&ride[i].c,&ride[i].d); ride[i].start=h*60+min; ride[i].end=ride[i].start+abs(ride[i].a-ride[i].c)+abs(ride[i].b-ride[i].d); } for(i=1;i<=m;i++) for(j=1;j<=m;j++) { if(i!=j) { if(ride[i].end+abs(ride[i].c-ride[j].a)+abs(ride[i].d-ride[j].b)+1<=ride[j].start) g[i][j]=1; } } printf("%d/n",m-hungary()); } system("pause"); return 0; }