poj 2060

来源:互联网 发布:电脑串口测试软件 编辑:程序博客网 时间:2024/05/23 01:12

最小路径覆盖练习

出租车……

两点之间可以在时间内到达就连一条边。

建图好后就是裸的了。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int _map[505][505];int t,num;int mark[1000],link[1000];struct book{    int st,et,a,b,c,d;}bo[1000];int _abs(int a,int b){    return a>b?a-b:b-a;}void print(int l){    for(int i=0;i<l;i++)    {        for(int j=0;j<l;j++)        {            printf("%d ",_map[i][j]);        }        printf("\n");    }}void build(){    for(int i=0;i<t;i++)    {        for(int j=0;j<t;j++)        {            if(bo[i].et+_abs(bo[i].c,bo[j].a)+_abs(bo[i].d,bo[j].b)<bo[j].st)            {                _map[i][j]=1;//                _map[j][i]=1;            }        }    }}void init(){    for(int i=0;i<t;i++)    {        for(int j=0;j<t;j++)        {            _map[i][j]=0;        }    }    for(int i=0;i<t;i++)    {        mark[i]=0;        link[i]=-1;    }    build();    num=0;}int dfs(int k){//    printf("%d\n"k)    for(int i=0;i<t;i++)    {        if(_map[k][i]&&!mark[i])        {            mark[i]=1;            if(link[i]==-1||dfs(link[i]))            {//                printf("k=%d,i=%d",k,i);                link[i]=k;                return 1;            }        }    }    return 0;}void minpath(){    for(int i=0;i<t;i++)    {        memset(mark ,0,sizeof(mark));        if(dfs(i))        {            num++;        }    }}int main(){//    freopen("in","r",stdin);    int n;    cin>>n;    while(n--)    {        scanf("%d",&t);        for(int i=0;i<t;i++)        {            int st1,st2,a,b,c,d;            scanf("%d:%d%d%d%d%d",&st1,&st2,&a,&b,&c,&d);            bo[i].a=a;            bo[i].b=b;            bo[i].c=c;            bo[i].d=d;            bo[i].st=st1*60+st2;            bo[i].et=bo[i].st+_abs(a,c)+_abs(b,d);        }        init();//        print(t);        minpath();        printf("%d\n",t-num);    }    return 0;}

0 0
原创粉丝点击