您的位置:首页 > 其它

POJ 2060 最小路径覆盖

2012-09-08 10:02 288 查看
[b]题意:[/b]

给出一个T 代表有T组样例

一个n 代表有n个任务

然后接下来n 个任务 给出出发时间和 出发地点(a, b)以及目的地(c, d) 从出发地到目的地花费时间为 |a - c| + |b - d|

问最少用多少辆车可以完成所有任务

[b]思路:[/b]

根据第 i 个任务结束时间+从第 i 个任务的目的地到 第 j 个任务的出发地 < 第 j 个任务的开始时间

确立这两个任务是否可以连通..如果可以就连线

然后求出最大匹配

任务数 - 最大匹配 = 最短路径覆盖

[b]Tips:[/b]

no tips..

[b]Code:[/b]

View Code

#include <stdio.h>
#include <cstring>
#define clr(x) memset(x, 0, sizeof(x))
#define fabs(x) ((x) > 0?(x):-(x))

const int INF = 0x1f1f1f1f;

struct Ride
{
int start;
int end;
int a, b, c, d;
}ride[510];

struct Edge
{
int next;
int to;
}edge[1000000];
int tot;
int head[510];

void add(int s, int u)
{
edge[tot].to = u;
edge[tot].next = head[s];
head[s] = tot++;
}

int link[510];
int vis[510];
int sum, n;

int dfs(int x)
{
for(int i = head[x]; i != 0; i = edge[i].next){
int y = edge[i].to;
if(!vis[y]){
vis[y] = true;
if(link[y] == 0 || dfs(link[y])){
link[y] = x;
return true;
}
}
}
return false;
}

void solve()
{
clr(link);
sum = 0;
for(int i = 1; i <= n; ++i){
clr(vis);
if(dfs(i))
sum++;
}
}

int main()
{
int i, j, k;
int T;
int h, m;
while(scanf("%d", &T) != EOF)
while(T--)
{
tot = 1;
clr(head);

scanf("%d", &n);
for(i = 1; i <= n; ++i){
scanf("%d:%d %d %d %d %d", &h, &m, &ride[i].a, &ride[i].b, &ride[i].c, &ride[i].d);
ride[i].start = h*60+m;
ride[i].end = ride[i].start + fabs(ride[i].a-ride[i].c)+fabs(ride[i].b-ride[i].d);
}

for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
if(ride[i].end + fabs(ride[i].c-ride[j].a)+fabs(ride[i].d-ride[j].b) < ride[j].start)
add(i, j);

solve();

printf("%d\n", n-sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: