UVA 1201 Taxi Cab Scheme(最小路徑覆蓋)

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=500+5;
int x1[maxn],y[maxn],x2[maxn],y2[maxn],t1[maxn],t2[maxn];
bool line[maxn][maxn],used[maxn];
int match[maxn],n;

bool find(int i)
{
    for(int j=1;j<=n;j++)
    {
        if(line[i][j]==true&&used[j]==false)
        {
            used[j]=true;
            if(match[j]==-1||find(match[j]))
            {
                match[j]=i;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(line,false,sizeof(line));
        memset(match,-1,sizeof(match));
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int a,b;char c[5];
            scanf("%s%d%d%d%d",c,&x1[i],&y[i],&x2[i],&y2[i]);
            a=(c[0]-'0')*10+c[1]-'0';
            b=(c[3]-'0')*10+c[4]-'0';
            t1[i]=a*60+b;
            t2[i]=t1[i]+abs(x1[i]-x2[i])+abs(y[i]-y2[i]);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(t2[i]+abs(x2[i]-x1[j])+abs(y2[i]-y[j])<t1[j]) line[i][j]=true;
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            memset(used,false,sizeof(used));
            if(find(i)) ans+=1;
        }
        printf("%d\n",n-ans);
    }
    return 0;
}

發佈了690 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章