zoukankan      html  css  js  c++  java
  • [洛谷P2417]课程

    题目链接:###

    点我

    题目分析:###

    二分图最大匹配裸题,跑完匈牙利判断(ans)是否等于教室数即可
    多组数据请注意初始化。

    代码:###

    #include<bits/stdc++.h>
    #define N 20000*2
    #define M 5000000*2
    inline int read(){
    	int cnt=0;int f=1;char c;
    	c=getchar();
    	while(!isdigit(c)){
    		if(c=='-')f=-f;
    		c=getchar();
    	}
    	while(isdigit(c)){
    		cnt=cnt*10+c-'0';
    		c=getchar();
    	}
    	return cnt*f;
    }
    int n,nxt[M],first[N],to[M],match[N],tot,ans,res,x,t,p,m;
    bool vis[N];
    void add(int x,int y){
    	nxt[++tot]=first[x];
    	first[x]=tot;
    	to[tot]=y;
    }
    int find(int u){
    	for(register int i=first[u];i;i=nxt[i]){
    		int v=to[i];
    		if(vis[v])continue;
    		else {
    			vis[v]=1;
    			if(match[v]==-1||find(match[v])){
    				match[v]=u;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    int hungary(){
    	for(register int i=1;i<=p;i++) match[i]=-1;
    	for(register int i=1;i<=n;i++){
    		for(register int j=1;j<=p;j++) vis[j]=false;
    		ans+=find(i);
    	}
    	return ans;
    }
    int main(){
    	t=read();
    	while(t--){
    		p=read();n=read();
    		for(register int i=1;i<=p;i++){
    			m=read();
    			for(register int j=1;j<=m;j++){
    				x=read();add(x,i);
    			}
    		}
    		res=hungary();
    		if(res==p)printf("YES
    ");
    		else printf("NO
    ");
    		for(register int i=1;i<=n;i++)first[i]=match[i]=0;
    		for(register int i=1;i<=tot;i++)nxt[i]=to[i]=0;
    		tot=0;res=0;ans=0;
    	}
    	return 0;
    }
    
  • 相关阅读:
    <译>Spark Sreaming 编程指南
    <译>Zookeeper官方文档
    <译>Flink官方文档-Flink概述
    <译>流计算容错
    <译>Flink编程指南
    <续>调度算法补充
    storm源码阅读笔记之任务调度算法
    海量数据处理方法归类
    storm中worker、executor、task之间的关系
    javax.swing.jFrame
  • 原文地址:https://www.cnblogs.com/kma093/p/10327266.html
Copyright © 2011-2022 走看看