• LA 3126 二分图匹配 最小路径覆盖


    本题最主要的就是拆点G[maxn][maxn],前面的是原来的点u,后面的是相对的u',如果接完客人u可以再去接客人v,则连G[u][v] = true; 然后就KM下,用n-m(匹配数)就是答案;

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    using namespace std;
    
    const int maxn = 505;
    
    int n,T,ans;
    struct guest{
    	int sx,sy;
    	int tx,ty;
    	int st;
    	int time;
    }gu[maxn];
    bool G[maxn][maxn];
    int link[maxn];
    int vis[maxn];
    
    bool judge(int i,int j){
    	int time = abs(gu[j].sx - gu[i].tx) + abs(gu[j].sy - gu[i].ty);
    	if(time + gu[i].st + gu[i].time < gu[j].st )  return true;
    	else return false;
    }
    bool dfs(int u){
    	for(int v=1;v<=n;v++){
    		if(G[u][v] && !vis[v]){
    			vis[v] = true;
    			if(link[v] == -1 || dfs(link[v])){
    				link[v] = u;
    				return true;
    			}
    		}
    	}
    	return false;
    }
    void KM(){
    	ans = 0;
    	memset(link,-1,sizeof(link));
    	for(int i=1;i<=n;i++){
    		memset(vis,0,sizeof(vis));
    		if(dfs(i))  ans++;
    	}
    }
    int main()
    {
    	//if(freopen("input.txt","r",stdin)== NULL)  {printf("Error\n"); exit(0);}
    	cin>>T;
    	for(int t=1;t<=T;t++){
    		cin>>n;
    		
    		for(int i=1;i<=n;i++){
    			int a,c; 
    			char b,d;
       			cin>>a>>b>>c;
       			gu[i].st = 60*a + c;
       			cin>>gu[i].sx>>gu[i].sy>>gu[i].tx>>gu[i].ty;
       			gu[i].time = abs(gu[i].sx - gu[i].tx) + abs(gu[i].sy - gu[i].ty);
    			   
    		}
    		
    		memset(G,0,sizeof(G));
    		for(int i=1;i<=n;i++)
    		   for(int j=i+1;j<=n;j++){
    		   	 if(judge(i,j) )   G[i][j] = true;
       			 else if(judge(j,i))   G[j][i] = true;
       		}
       		KM();
    		printf("%d\n",n-ans);
    	}
    }
     
    

      

  • 相关阅读:
    Sublime安装package control的操作
    Sublime的简单操作
    C# 泛型方法
    C# 数组的讲解(ArrayList 与List的区别)
    免费的天气API
    bootstrapValidator的验证
    sqlServer 多行合并为一行
    bootstrap的安装注意
    SQL数据库中把一个表中的数据复制到另一个表中
    JavaScript的误区
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3091355.html
Copyright © 2020-2023  润新知