BZOJP1001狼抓兔子 对偶图

题意就是最小割。。。。
嘛,但有个很妙的做法。。
就是对偶图。。。。。。
然后跑一遍最短路就好了。。。

#include<bits/stdc++.h>
#define MAXN 20000005
#define maxn 2005
using namespace std;

/*
原图有三种边
1.横着   就 上----下
2.竖着 左减1---》》右
3.斜着  上下两成 
*/

int n,m,tot,s,t;
int h[MAXN],dis[MAXN],vis[MAXN];
struct node{
	int from,to,cost,next;
}e[MAXN<<1];

void init(){
	tot = s = 0;
	t = MAXN - 3;
	memset(h , -1 , sizeof(h));
	memset(dis , 0x7f , sizeof(dis));
	memset(vis , -1 , sizeof(vis));
} 

void add(int x , int y , int z){
	tot++;
	e[tot].from = x;
	e[tot].to = y;
	e[tot].cost = z;
	e[tot].next = h[x];
	h[x] = tot;
	swap(x , y);
	tot++;
	e[tot].from = x;
	e[tot].to = y;
	e[tot].cost = z;
	e[tot].next = h[x];
	h[x] = tot;
}

int zhuan(int x , int y){
	return (x - 1) * (m -1) + y;
}

struct node2{
	int x,y;
	bool operator<(const node2& a) const
    {
         return y > a.y;
    }
}; 

void solve(){
	priority_queue<node2> q;
	q.push((node2){s , 0});
	dis[s] = 0;
	while(!q.empty()){
		node2 u = q.top();
		q.pop();
		if(vis[u.x] == 1)continue;
		vis[u.x] = 1;
		for(int i = h[u.x] ; i != (-1) ; i = e[i].next){
			if(dis[e[i].to] > u.y + e[i].cost){
				dis[e[i].to] = u.y + e[i].cost;
				q.push((node2){e[i].to , dis[e[i].to]});
			}
		}
	}
	cout<<dis[t]<<endl;
}

int main(){
	init();
	cin>>n>>m;
	//横向道路,第一层与终点相连,其他上接下。。。最后一层与起点向连
	for(int i = 0 ; i < n ; i++){
		for(int j = 1 ; j < m ; j++){
			int z;cin>>z;
			if(i == 0)add(j , t , z);
			else if(i == n - 1)add(zhuan((i<<1) , j) , s , z);
			else add(zhuan((i<<1) , j) , zhuan((i<<1) + 1 , j) , z);
		}
	}
	//纵向道路 与上类似 
	for(int i = 1 ; i < n ; i++){
		for(int j = 1 ; j <= m ; j++){
			int z;cin>>z;
			if(j == 1)add(s , zhuan((i<<1) , j) , z);
			else if(j == m)add(t , zhuan((i<<1) - 1 , j - 1) , z);
			else add(zhuan((i<<1) - 1 , j - 1) , zhuan((i<<1) , j) , z);
		}
	}
	//斜向道路
	for(int i = 1 ; i < n ; i++){
		for(int j = 1 ; j < m ; j++){
			int z;cin>>z;
			add(zhuan((i<<1) - 1 , j) , zhuan((i<<1) , j) , z);
		}
	} 
	solve();
} 
  • 0
    点赞
  • 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、付费专栏及课程。

余额充值