hdu 5772 String Problem

题目

给你一个包含0-9的序列,如果你选择了这个序列的第i位和第j为,那么你能得到w[i][j]+w[j][i]的收益,然后对于你选择的那些数字是有一定的花费的,花费为a[i]*(k-1)+b[i],a[i]和b[i]是数字i的两个参数,k代表数字i选了多少次。

题解

其实就是最大权闭合子图的变式。
顺便回顾了最大权闭合子图的写法。下面会用(u,v,上限)这种形式表示建边。
一般是用于,需要付出代价选每个物品,某些物品凑一起组合可以产生一定价值。
方法是最小割。先假设拿到所有的价值,不付出代价,建立类似二分图,左边一排是物品,右边是组合,先(当前组合所需每个物品,组合,INF)然后(S,每个物品,物品代价) (每个组合,T,组合收益)
答案=所有价值-最小割
如果最小割中,某个物品与S的边被割了,说明选了这个物品,付出了代价,某个组合与T的边被割了,说明这个组合没有凑成,这个价值没有拿到。

然而在此题中有变式,物品被分为几类,第一次拿某类物品需要付出额外代价。也就是只要拿了这类物品就需要付出一个代价。可以给每类一个节点,(S,类节点,对应代价)(*),(类节点,所有该类物品,INF),可以发现,如果选了该类某个物品,那么( *)边必然会被割掉,因为不割会出现一条显然的增广路,并且也不会影响物品单独的代价。

代码

可能有同学看不懂我的语言。。我贴一下建边的代码,Dinic的板子就不帖了。
啊。。这个高亮有点亮

#define rep(i,x,y) for(int i=x;i<=y;++i)

		int n,ans=0;cin>>n;
		scanf("%s",s+1);
		rep(i,0,9) scanf("%d%d",a+i,b+i);
		rep(i,1,n) rep(j,1,n) {
			scanf("%d",w[i]+j);
			if(i!=j) ans+=w[i][j];
		}
		S=n*n+11,T=S+1;
		rep(i,1,n) add_edge(S,i,a[s[i]-'0'],0);

		int cur=n+1;
		rep(i,1,n) rep(j,1,n) if(i!=j){
			add_edge(i,cur,INF,0);
			add_edge(j,cur,INF,0);
			add_edge(cur,T,w[i][j],0);
			++cur;
		}
		rep(i,1,n) add_edge(n*n+s[i]-'0'+1,i,INF,0);
		rep(i,0,9) add_edge(S,n*n+i+1,b[i]-a[i],0);
		int mf=MF();
		printf("Case #%d: %d\n",++kase,ans-mf);

后记

啊啊啊啊网络流什么都不记得了真的是菜死我了。
另外也不是很明白网络流的复杂度,二分图,大概1w多个点,3w条边,20组居然能跑得这么快的吗,Dinic跑了31ms。。可能是我对他们复杂度有什么误解。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值