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); } }
相关文章推荐
- BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)
- bzoj 1001: [BeiJing2006]狼抓兔子(s-t平面图求最大流)
- BZOJ 1001 狼抓兔子 平面图上的最大流--跑最短路
- BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)
- [bzoj1001][BJOI2006]狼抓兔子——最大流转最短路,平面图
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
- bzoj1001 [BeiJing2006]狼抓兔子(最小割/平面图最大流转对偶图最短路)
- BZOJ 1001 狼抓兔子(最大流-对偶图最短路)
- BZOJ [BeiJing2006]狼抓兔子 平面图最大流
- 【bzoj1001】【BeiJing2006】【狼抓兔子】【网络流】【平面图转对偶图】
- [BZOJ1001]Beijing2006 狼抓兔子|平面图转对偶图
- bzoj1001狼抓兔子——网络流平面图问题
- bzoj 1001 平面图转换求最大流(最小割)
- 狼抓兔子 BZOJ1001 平面图最小割转对偶图最短路
- BZOJ 1001 狼抓兔子 平面图最小割
- BZOJ 1001([BeiJing2006]狼抓兔子-最大流转对偶图最短路)
- BZOJ 1001 平面图与对偶图的转化 最短路Or最大流
- BZOJ 1001 狼抓兔子 [最小割转最短路=平面图转对偶图]
- BZOJ 1001([BeiJing2006]狼抓兔子-最大流转对偶图最短路)