zoukankan      html  css  js  c++  java
  • luogu P2526 [SHOI2001]小狗散步 |二分图匹配

    题目背景

    Grant喜欢带着他的小狗Pandog散步。Grant以一定的速度沿着固定路线走,该路线可能自交。Pandog喜欢游览沿途的景点,不过会在给定的N个点和主人相遇。小狗和主人同时从(X1,Y1)点出发,并同时在(Xn,Yn)点汇合。小狗的速度最快是Grant的两倍。当主人从一个点以直线走向另一个点时,Pandog跑向一个它感兴趣的景点。Pandog每次与主人相遇之前最多只去一个景点。
    题目描述

    你现在的任务是:为Pandog寻找一条路线(有可能与主人的路线部分相同),使它能够游览最多的景点,并能够准时与主人在给定地点相遇或者汇合。

    输入格式

    输入文件第一行是两个整数N和M( 1≤N,M≤100 );

    输入文件第二行的N个坐标给出了Grant的散步路线,即Pandog和主人相遇地点;

    输入文件第三行的M个坐标给出了所有Pandog感兴趣的景点。

    所有输入的坐标均不相同,且绝对值不超过1000。

    输出格式

    输出小狗的移动路线。

    第一行是经过的点数,第二行依次为经过的点的坐标(直角坐标系)


    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=1e3+10;
    inline int read(){
        int x=0,f=1;
        char ch=getchar();
        while(ch<'0'||ch>'9'){
            if(ch=='-')
                f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9'){
            x=(x<<1)+(x<<3)+(ch^48);
            ch=getchar();
        }
        return x*f;
    }
    int n,m;
    struct node{
    	int x,y;
    }a[N],b[N],c[N];
    bool f[N][N];
    inline double dis(node t1,node t2){
    	return sqrt((t1.x-t2.x)*(t1.x-t2.x)+(t1.y-t2.y)*(t1.y-t2.y));
    }
    bool vis[N];
    int match[N];
    int dfs(int u){
    	for(int i=1;i<=m;i++){
    		if(f[u][i]&&!vis[i]){
    			vis[i]=1;
    			if(!match[i]||dfs(match[i])){
    				match[i]=u;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    bool ok[N];
    signed main(){
    	n=read(),m=read();
    	for(int i=1;i<=n;i++)a[i].x=read(),a[i].y=read();
    	for(int i=1;i<=m;i++)b[i].x=read(),b[i].y=read();
    	
    	for(int i=1;i<n;i++){
    		for(int j=1;j<=m;j++)
    		if(dis(a[i],a[i+1])>=(dis(a[i],b[j])+dis(a[i+1],b[j]))/2.0)
    		f[i][j]=1;
    	}
    	for(int i=1;i<n;i++){
    		memset(vis,0,sizeof(vis));
    		dfs(i);
    	}
    	int ans=n;
    	for(int i=1;i<=m;i++)
    	if(match[i])c[match[i]]=b[i],ans++,ok[match[i]]=1;
    	cout<<ans<<endl;
    	for(int i=1;i<=n;i++){
    		printf("%d %d ",a[i].x,a[i].y);
    		if(ok[i])printf("%d %d ",c[i].x,c[i].y);
    	}
    }
    
  • 相关阅读:
    asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像
    C#中DataTable中的Compute方法使用收集
    c#的DateTime.Now函数详解
    附加数据库失败,拒绝访问
    xml文件绑定chenckbox选择框
    Maximum Xor Secondary(单调栈好题)
    Y(类树形DP)
    Average distance(类树形DP)
    Balls and Boxes (模拟题)
    Party at Hali-Bula(树形DP+判断方案数是否唯一)
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/12753096.html
Copyright © 2011-2022 走看看