社区讨论

40pts WA 求调

P4001[ICPC-Beijing 2006] 狼抓兔子参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mkgnp1uf
此快照首次捕获于
2026/01/16 17:08
上个月
此快照最后确认于
2026/01/18 20:20
上个月
查看原帖
可以转化为对偶图最短路,不知道为什么只能过前两个 /kel
不知道是不是对偶图建错了。
CPP
#include<bits/stdc++.h>
#define endl '\n'
#define N 2000006
#define M 1006
using namespace std; using i64=long long;
vector<pair<int,int> > G[N];
priority_queue<pair<i64,int>,vector<pair<i64,int> >,greater<pair<i64,int> > > q;
int n,m,s,t,vis[N],a[M][M],b[M][M],c[M][M]; i64 dis[N];
inline void add(int u,int v,int w) {G[u].push_back({v,w}),G[v].push_back({u,w});}
inline int id1(int x,int y) {return (x-1)*(m-1)+y;}
inline int id2(int x,int y) {return id1(x,y)+(n-1)*(m-1);}
main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<m;j++)scanf("%d",&a[i][j]);
	for(int i=1;i<n;i++)
		for(int j=1;j<=m;j++)scanf("%d",&b[i][j]);
	for(int i=1;i<n;i++)
		for(int j=1;j<m;j++)scanf("%d",&c[i][j]);
	s=(n-1)*(m-1)*2+1,t=s+1;
	for(int i=1;i<m;i++)
		add(s,id1(1,i),a[1][i]),add(id2(n-1,i),t,a[n][i]);
	for(int i=2;i<n;i++)
		for(int j=1;j<m;j++)add(id2(i-1,j),id1(i,j),a[i][j]);
	for(int i=1;i<n;i++)
		add(s,id1(i,m-1),b[i][m]),add(id2(1,i),t,b[i][1]);
	for(int i=1;i<n;i++)
		for(int j=2;j<m;j++)add(id1(i,j-1),id2(i,j),b[i][j]);
	for(int i=1;i<n;i++)
		for(int j=1;j<m;j++)add(id1(i,j),id2(i,j),c[i][j]);
	memset(dis,0x3f,sizeof(dis)),q.push({0,s}),dis[s]=0;
	while(q.size())
	{
		auto t=q.top(); q.pop();
		int u=t.second; i64 d=t.first;
		if(vis[u])continue; vis[u]=1;
		for(auto v:G[u])if(!vis[v.first]&&dis[v.first]>dis[u]+v.second)
			dis[v.first]=dis[u]+v.second,q.push({dis[v.first],v.first});
	}
	printf("%lld\n",dis[t]);
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...