热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LA2531TheK-League最大流

LA2531题意:有n个队伍比赛,给出n个队伍赢的次数和输的次数,然后再输入每个队伍还需要的比赛次数,确定所有可能得冠军的球队(获胜场数最多的得冠军,可以并列)思路:假设a可以拿冠军,先求出

LA 2531

题意:有n个队伍比赛,给出n个队伍赢的次数和输的次数,然后再输入每个队伍还需要的比赛次数,确定所有可能得冠军的球队(获胜场数最多的得冠军,可以并列)

思路:假设a可以拿冠军,先求出a获胜的总次数tot,把每两个队伍的比赛(u,v)看成节点,从源点S连接一条弧到比赛节点,容量为比赛次数(注意排除0次比赛),然后把比赛(u,v)分别连接一条弧到到u,v,容量为 tot - win(u)和 tot - win(v),然后把每个队伍节点连接到汇点T,容量无限大,再求最大流,如果S出发的每条弧流量的是满的,说明在a在剩下比赛的全胜的情况下,其他的队伍获胜次数不超过 tot 的情况下,比赛可以打完,a可以拿冠军,否则在限制其他队伍获胜次数下比赛打不完,a不能拿冠军。

#include
#include
#include
#include
#include
using namespace std;
const int maxn=1000;
const int inf=1e9;
struct Edge
{
	int from,to,cap,flow;
};
struct Dinic
{
	int n,m,s,t;
	vectoredges;
	vectorG[maxn];
	bool vis[maxn];
	int d[maxn],cur[maxn];
	void init(int n)
	{
		this->n=n;
		for(int i=0;iQ;
		Q.push(s);
		d[s]=0;
		vis[s]=1;
		while(!Q.empty())
		{
			int x=Q.front();Q.pop();
			for(int i=0;ie.flow)
				{
					vis[e.to]=1;
					d[e.to]=d[x]+1;
					Q.push(e.to);
				}
			}
		}
		return vis[t];
	}
	int dfs(int x,int a)
	{
		if(x==t||a==0)return a;
		int flow=0,f;
		for(int& i=cur[x];i0)
			{
				e.flow+=f;
				edges[G[x][i]^1].flow-=f;
				flow+=f;
				a-=f;
				if(a==0)break;
			}
		}
		return flow;
	}
	int Maxflow(int s,int t)
	{
		this->s=s,this->t=t;
		int flow=0;
		while(bfs())
		{
			memset(cur,0,sizeof(cur));
			flow+=dfs(s,inf);
		}
	}
	int check()
	{
		int flag=1;
		for(int i=0;iedges[G[0][i]].flow)
		flag=0;
		return flag;
	}
}solver;
int win[30],lose[30],cont[30][30];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		vectorans;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		scanf("%d%d",&win[i],&lose[i]);
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		scanf("%d",&cont[i][j]);
		for(int i=1;i<=n;i++)
		{
			int tot=0;
			for(int j=1;j<=n;j++)
			tot+=cont[i][j];
			tot+=win[i];
			int flag=1;
			for(int j=1;j<=n;j++)
			if(j!=i&&tot-win[j]<0)//已经有队伍获胜次数超过了tot,i不能拿冠军 
			flag=0;
			if(!flag)
			continue;
			solver.init(maxn);
			int res=n;
			for(int j=1;j

 


推荐阅读
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
author-avatar
手机用户2502853457
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有