社区讨论
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 条回复,欢迎继续交流。
正在加载回复...