zoukankan      html  css  js  c++  java
  • 【平面图】【最小割】【最短路】【Heap-Dijkstra】bzoj1001 [BeiJing2006]狼抓兔子

    http://wenku.baidu.com/view/8f1fde586edb6f1aff001f7d.html

    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    #define N 1001
    int n,m,S,T,nn;
    struct Point{int u,d;};
    bool operator < (Point a,Point b){return a.d>b.d;}
    int dis[N*N*2+2];
    bool vis[N*N*2+2];
    priority_queue<Point>q;
    int en,v[N*N*3*2],next[N*N*3*2],w[N*N*3*2],first[N*N*2+2];
    void AddEdge(int U,int V,int W)
    {
    	v[++en]=V;
    	w[en]=W;
    	next[en]=first[U];
    	first[U]=en;
    }
    void dijkstra()
    {
    	memset(dis+1,0x7f,sizeof(int)*(nn));
    	dis[S]=0; q.push((Point){S,0});
    	while(!q.empty())
    	  {
    	  	int U=q.top().u; q.pop();
    	  	if(!vis[U])
    	  	  {
    	  	  	vis[U]=1;
    	  	  	for(int i=first[U];i;i=next[i])
    	  	  	  if((ll)dis[v[i]]>(ll)dis[U]+(ll)w[i])
    	  	  	    {
    	  	  	      dis[v[i]]=dis[U]+w[i];
    	  	  	      q.push((Point){v[i],dis[v[i]]});
    	  	  	    }
    	  	  }
    	  }
    }
    int main()
    {
    	int x;
    	scanf("%d%d",&n,&m); nn=(n-1)*(m-1)*2+2; S=nn-1; T=nn;
    	for(int j=1;j<m;++j)
    	  {
    	  	scanf("%d",&x);
    	  	AddEdge(S,j,x);
    	  	AddEdge(j,S,x);
    	  }
    	for(int i=2;i<n;++i)
    	  for(int j=1;j<m;++j)
    	    {
    	      scanf("%d",&x);
    	      AddEdge(((i<<1)-3)*(m-1)+j,((i<<1)-2)*(m-1)+j,x);
    	      AddEdge(((i<<1)-2)*(m-1)+j,((i<<1)-3)*(m-1)+j,x);
    	    }
    	for(int j=1;j<m;++j)
    	  {
    	  	scanf("%d",&x);
    	  	AddEdge(((n<<1)-3)*(m-1)+j,T,x);
    	  	AddEdge(T,((n<<1)-3)*(m-1)+j,x);
    	  }
    	for(int i=1;i<n;++i)
    	  {
    	  	scanf("%d",&x);
    	  	AddEdge(T,((i<<1)-1)*(m-1)+1,x);
    	  	AddEdge(((i<<1)-1)*(m-1)+1,T,x);
    	  	for(int j=2;j<m;++j)
    	  	  {
    	  	  	scanf("%d",&x);
    	  	  	AddEdge(((i<<1)-2)*(m-1)+j-1,((i<<1)-1)*(m-1)+j,x);
    	  	  	AddEdge(((i<<1)-1)*(m-1)+j,((i<<1)-2)*(m-1)+j-1,x);
    	  	  }
    	  	scanf("%d",&x);
    	  	AddEdge(((i<<1)-1)*(m-1),S,x);
    	  	AddEdge(S,((i<<1)-1)*(m-1),x);
    	  }
    	for(int i=1;i<n;++i)
    	  for(int j=1;j<m;++j)
    	    {
    	      scanf("%d",&x);
    	      AddEdge(((i<<1)-2)*(m-1)+j,((i<<1)-1)*(m-1)+j,x);
    	      AddEdge(((i<<1)-1)*(m-1)+j,((i<<1)-2)*(m-1)+j,x);
    	    }
    	dijkstra();
    	printf("%d
    ",dis[T]);
    	return 0;
    }
  • 相关阅读:
    去重
    JavaScript 数组
    变量
    2017.3.19 for
    2017.3.19 if,for
    2017.3.14
    2017.3.10
    2017.3.9
    2017.3.7-1
    2017.3.7
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4453567.html
Copyright © 2011-2022 走看看