文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>pku2060 Taxi Cab Scheme

pku2060 Taxi Cab Scheme

时间:2010-08-06  来源:Z_Q_2010

最小路径覆盖问题:用尽量少的不相交简单路径覆盖有向无环图的所有顶点。
由此满足条件:
.一个单独的顶点是一条路径;
2.如果存在一路径p1,p2,......pk,其中p1 为起点,pk为终点,那么在覆盖图中,顶点p1,p2,......pk不再与其它的顶点之间存在有向边.
 
 

#include<stdio.h>
#include<math.h>

const int Maxn=501;
bool g[Maxn][Maxn],visit[Maxn];
int link[Maxn];
int n;
struct node //将每个出租情况抽象成有向无环图中的一个顶点

{
    int hour,minute,x1,x2,y1,y2;
    bool onTime(node var)    
    {
        if((var.hour-hour)*60+var.minute-minute>abs(x2-x1)+abs(y2-y1)+abs(var.x1-x2)+abs(var.y1-y2))
            return true;        //两点之间能构成有向边    

        else
            return false;
    }
}time[Maxn];

bool find(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(g[x][i]&&!visit[i])
        {
            visit[i]=true;
            if(link[i]==0||find(link[i]))
            {
                link[i]=x;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    int cases;
    scanf("%d",&cases);
    while(cases--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                g[i][j]=false;
        for(int i=1;i<=n;i++)
            link[i]=0;
        for(int i=1;i<=n;i++)    
        {
            scanf("%d:%d%d%d%d%d",&time[i].hour,&time[i].minute,&time[i].x1,&time[i].y1,&time[i].x2,&time[i].y2);
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(time[i].onTime(time[j]))
                    g[i][j]=true;
        int match=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                visit[j]=false;
            if(find(i))
                match++;
        }
        printf("%d\n",n-match);
    }
    return 0;
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载