记录编号 37770 评测结果 AAAAAA
题目名称 [BJOI2006] 狼抓兔子 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.487 s
提交时间 2012-04-07 18:55:10 内存使用 30.83 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
#include <cstring>
#include <utility>
using namespace std;
const int MAXN=1000*1000+100;
const int INF=~0U>>1;
vector<int> Map[MAXN];
vector<int> Val[MAXN];
queue<int> Q;
int dist[MAXN];
int flag[MAXN];
int N,M,Source,Sink;
priority_queue<pair<int,int> > PQ;
inline void SP()
{
    for(int i=0;i<=Sink;i++) {flag[i]=0,dist[i]=INF;}
    dist[Source]=0;
    PQ.push(make_pair(0,Source));
    int u,v,cost;
    while(!PQ.empty())
    {
        u=PQ.top().second;
		if(u==Sink) {printf("%d\n",-PQ.top().first);return;}
        PQ.pop();
        if(!flag[u])
        {
            flag[u]=1;
            for(unsigned int i=0;i<Map[u].size();i++)
            {
                v=Map[u][i];
                cost=Val[u][i];
                if(!flag[v]&&dist[v]-dist[u]>cost)
                {
                    dist[v]=dist[u]+cost;
                    PQ.push(make_pair(-dist[v],v));
                }
            }
        }
    }
	printf("%d\n",dist[Sink]);
}
  
void AddEdge(int s,int e,int f)
{
    Map[s].push_back(e);
    Val[s].push_back(f);
    Map[e].push_back(s);
    Val[e].push_back(f);
}
  
void init()
{
    int x;
    scanf("%d %d\n",&N,&M);
     
    if(N==1 || M==1)
    {
        int Ans=INF,x;
        if(N==1)
        {
            for(int i=1;i<=M-1;i++)
            {
                scanf("%d",&x);
                if(x<Ans) Ans=x;
            }
            printf("%d\n",Ans);
        }
        else
        {
            for(int i=1;i<=N-1;i++)
            {
                scanf("%d\n",&x);
                if(x<Ans) Ans=x;
            }
            printf("%d\n",Ans);
        }
        return;
    }
     
    Source=0,Sink=(N-1)*(M-1)*2+1;
    /*以下橫向道路*/
    for(int i=1;i<=M-1;i++) { scanf("%d",&x); AddEdge(Source,2*i,x); }
    for(int i=2;i<=N-1;i++)
        for(int j=1;j<=M-1;j++) { scanf("%d",&x); AddEdge((i-2)*(M-1)*2+(j-1)*2+1,(i-1)*(M-1)*2+j*2,x);}
    for(int i=1;i<=M-1;i++) {scanf("%d",&x); AddEdge(Sink,(N-2)*(M-1)*2+i*2-1,x); }
    /*以下縱向道路*/
    for(int i=1;i<=N-1;i++)
    {
        scanf("%d",&x); AddEdge(Sink,(i-1)*(M-1)*2+1,x);
        for(int j=2;j<=M-1;j++)  { scanf("%d",&x); AddEdge((i-1)*(M-1)*2+(j-1)*2,(i-1)*(M-1)*2+(j-1)*2+1,x); }
        scanf("%d",&x); AddEdge(Source,i*(M-1)*2,x);
    }
    /*以下斜向道路*/
    for(int i=1;i<=N-1;i++)  for(int j=1;j<=M-1;j++)
    {
        scanf("%d",&x); AddEdge((i-1)*(M-1)*2+(j-1)*2+1,(i-1)*(M-1)*2+j*2,x);
    }
    SP();
}
  
int main()
{
    freopen("bjrabbit.in","r",stdin);
    freopen("bjrabbit.out","w",stdout);
    init();
    return 0;
}