您的位置:首页 > 其它

BZOJ 1001 狼追兔子 平面图最大流

2015-05-14 11:04 363 查看
//为什么点数都要乘以2呢?

//还是默默的学一下dij吧;;
//s.t的摆放是为什么???

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<algorithm>
#define maxn 2000100
#define maxm 6000000
#define inf 0x3f3f3f
using namespace std;
int em;
int head[maxn];
int d[maxn];
bool vis[maxn];

struct Edge
{
int u,v,w,next;
}edge[maxm];

void add(int u,int v,int w)
{
edge[em].u=u;
edge[em].v=v;
edge[em].w=w;
edge[em].next=head[u];
head[u]=em++;
// cout<<u<<" "<<v<<" "<<w<<" de  "<<endl;
}

struct data
{
int d;int u;
data(int a,int b):u(a),d(b){}
bool operator < (const data &T) const{ return d>T.d;}
};

priority_queue <data>q;
void dij(int s,int t)
{
for(int i=0;i<=t+1;i++)
d[i]=inf;
memset(vis,false,sizeof(vis));
while(!q.empty()) q.pop();
q.push(data(s,0)); d[s]=0;
while(!q.empty())
{
int u=q.top().u;
q.pop();
if(vis[u]) continue;
if(u==t) {cout<<d[t]<<endl;return;}
vis[u]=1;
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].v;
if(!vis[v]&& d[v]>d[u]+edge[i].w)
{
d[v]=d[u]+edge[i].w;
q.push(data(v,d[v]));
}
}
//  cout<<d[t]<<endl;
}
}

int xx,yy,z,n,m,miao;
//哪一块为s,t什么的是为什么?
int main()//哦、、我忘了他的每一个正方形被分为两块,所以要*2什么的。。
{
//    freopen("input.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
// cout<<n<<" "<<m<<endl;
if(n==1 && m==1) {printf("0\n");continue;}
if(n==1||m==1)
{
int ans=inf;
if(n<m) swap(n,m);
for(int i=1;i<=n;i++)
scanf("%d",&miao),ans=min(ans,miao);
cout<<ans<<endl;
continue;
}
//cout<<"miao"<<endl;
em=0;memset(head,-1,sizeof(head));
int s=0;int t=(n-1)*(m-1)*2+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m-1;j++)
{
scanf("%d",&z);
xx=((i-2)*(m-1)+j)*2;
yy=((i-1)*(m-1)+j)*2-1;
if(i==1) xx=t;
if(i==n) yy=s;//为什么这里要反呢?
add(xx,yy,z);
add(yy,xx,z);
}
for(int i=1;i<=n-1;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&z);
xx=((i-1)*(m-1)+j-1)*2-1;
yy=((i-1)*(m-1)+j)*2;
if(j==1) xx=s;
if(j==m) yy=t;//这个s,t 是怎么弄得?
add(xx,yy,z);
add(yy,xx,z);
}
for(int i=1;i<=n-1;i++)
for(int j=1;j<=m-1;j++)
{
scanf("%d",&z);
xx=((i-1)*(m-1)+j)*2;
yy=((i-1)*(m-1)+j)*2-1;
add(xx,yy,z);
add(yy,xx,z);
}
dij(s,t);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: