您的位置:首页 > 其它

BZOJ1001 [BeiJing2006]狼抓兔子(平面图最小割转最短路)

2016-05-05 19:26 489 查看
。。和HDU3870类似。。注意n=1和m=1的情况。

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define INF (1<<30)
#define MAXN 2800000
struct Edge{
int v,w,next;
}edge[MAXN<<2];
int vs,vt,NV,NE,head[MAXN];
void addEdge(int u,int v,int w){
edge[NE].v=v; edge[NE].w=w; edge[NE].next=head[u];
head[u]=NE++;
}
struct Node{
int u,d;
Node(int _u=0,int _d=0):u(_u),d(_d){}
bool operator<(const Node &nd)const{
return nd.d<d;
}
};
int d[MAXN];
bool vis[MAXN];
int dijkstra(){
for(int i=0; i<NV; ++i){
d[i]=INF; vis[i]=0;
}
d[vs]=0;
priority_queue<Node> que;
que.push(Node(vs,0));
while(!que.empty()){
Node nd=que.top(); que.pop();
if(nd.u==vt) return nd.d;
if(vis[nd.u]) continue;
vis[nd.u]=1;
for(int i=head[nd.u]; i!=-1; i=edge[i].next){
int v=edge[i].v;
if(vis[v]) continue;
if(d[v]>d[nd.u]+edge[i].w){
d[v]=d[nd.u]+edge[i].w;
que.push(Node(v,d[v]));
}
}
}
return INF;
}
int main(){
int n,m,a;
scanf("%d%d",&n,&m);
if(n==1 && m==1){
puts("0");
return 0;
}
vs=(n-1)*(m-1)*2; vt=vs+1; NV=vt+1; NE=0;
memset(head,-1,sizeof(head));
int mm=INF;
for(int i=0; i<n; ++i){
for(int j=0; j<m-1; ++j){
scanf("%d",&a);
mm=min(mm,a);
if(i==0) addEdge(i*(m-1)+j,vt,a);
if(i==n-1) addEdge(vs,(i-1)*(m-1)+j+(n-1)*(m-1),a);
if(i!=0 && i!=n-1){
addEdge(i*(m-1)+j,(i-1)*(m-1)+j+(n-1)*(m-1),a);
addEdge((i-1)*(m-1)+j+(n-1)*(m-1),i*(m-1)+j,a);
}
}
}
for(int i=0; i<n-1; ++i){
for(int j=0; j<m; ++j){
scanf("%d",&a);
mm=min(mm,a);
if(j==0) addEdge(vs,i*(m-1)+j+(n-1)*(m-1),a);
if(j==m-1) addEdge(i*(m-1)+j-1,vt,a);
if(j!=0 && j!=m-1){
addEdge(i*(m-1)+j+(n-1)*(m-1),i*(m-1)+j-1,a);
addEdge(i*(m-1)+j-1,i*(m-1)+j+(n-1)*(m-1),a);
}
}
}
for(int i=0; i<n-1; ++i){
for(int j=0; j<m-1; ++j){
scanf("%d",&a);
mm=min(mm,a);
addEdge(i*(m-1)+j,i*(m-1)+j+(n-1)*(m-1),a);
addEdge(i*(m-1)+j+(n-1)*(m-1),i*(m-1)+j,a);
}
}
if(n==1 || m==1) printf("%d",mm);
else printf("%d",dijkstra());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: