您的位置:首页 > 其它

Problem F

2013-04-29 21:11 309 查看
最小边覆盖

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <queue>

#include <cstring>

#include <string>

#include <cmath>

#include <vector>

#include <map>

#include <stack>

#include <algorithm>

//#include "myAlgorithm.h"

#define MAX 10005

#define OFFENCE (1e9 + 5)

#define INF (1e8 + 5)

#define eps 1e-9

#define Rep(s, e) for( int i = s; i <= e; i++)

#define Cep(e, s) for( int j = e; j >= s; j --)

#define PI acos(-1.0)

//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂

using namespace std;

int n;

int match[MAX];

bool v[MAX];

vector<vector<int> >adj;

void init() {

    memset(match, -1, sizeof(match));

    adj.assign(n + 2, vector<int>() );

}

bool find(int node) {

    int len = adj[node].size(), pos;

    Rep(0 , len - 1) {

        pos = adj[node][i];

        if(!v[pos]) {

            v[pos] = 1;

            int pre = match[pos];

            if(pre == -1 || find(pre)) {

                match[pos] = node;

                return true;

            }

        }

    }//cout<<endl;

    return false;

}

struct Ride {

    int hh, mm;

    int sa, sb, ea, eb;

} r[MAX];

void make_adj() {

    Rep(0, n -1) {

        for(int j = i + 1; j < n; j++) {

            int rt = abs(r[i].ea - r[j].sa) + abs(r[i].eb - r[j].sb);

            int mt = (r[j].hh - r[i].hh) * 60 + r[j].mm - r[i].mm  -  rt - (abs(r[i].ea - r[i].sa) + abs(r[i].eb - r[i].sb));

            if(mt > 0) {

                adj[i].push_back(j);

                //  adj[j].push_back(i);

            }

        }

    }

}

int main() {

    int T;

    cin>>T;

    while(T--) {

        cin>>n;

        init();

        Rep(0, n - 1) {

            scanf(" %d:%d %d %d %d %d", &r[i].hh, &r[i].mm, &r[i].sa, &r[i].sb,&r[i].ea, &r[i].eb);

            //cin>>r[i].hh>>tt>>r[i].mm>>r[i].sa>>r[i].sb>>r[i].ea>>r[i].eb;

            //cout<<r[i].sa<<" "<<r[i].sb<<" "<<r[i].ea<<r[i].eb<<endl;

        }

        make_adj();

        int fc = 0;

        Rep(0, n -1) {

            if(find(i))fc++;

            memset(v, 0, sizeof(v));

        }

        cout<<n - fc<<endl;

    }

    return 0;

}

/**

*/

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息