Bzoj 2346: [Baltic 2011]Lamp dijkstra,堆

2346: [Baltic 2011]Lamp

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 428  Solved: 179
[Submit][Status][Discuss]

Description

2255是一个傻X,他连自己家灯不亮了都不知道。
某天TZ大神路过他家,发现了这一情况,
于是TZ开始行侠仗义了。
TZ发现是电路板的问题,
他打开了电路板,发现线路根本没有连上!!
于是他强大的脑力可以使某个格子上的线路从\变为/,
或者从/变为\。
2255不会电路(因为他什么都不会),但是他想知道TZ最少要用多少次脑力才能使他家的灯变亮。
如果无法变亮,输出“NO SOLUTION”。

n,m<=500

Input

 

Output

 

Sample Input

3 5
\\/\\
\\///
/\\\\

Sample Output

1

HINT

 

Source

 题解:
dijkstra+堆优化.
这道题可以很容易的想到。当格子为'\',把从左上到右下加边,边权为0,右上到左下加边,边权为1。格子为'/'同理。
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define MAXN 251011
  4 #define INF 1e9
  5 struct node
  6 {
  7     int begin,end,value,next;
  8 }edge[1000010];
  9 int Head[MAXN],cnt,N,m,dis[MAXN],Heap[MAXN],SIZE,pos[MAXN];
 10 int xy(int x,int y){return (x-1)*(m+1)+y;}
 11 void addedge(int bb,int ee,int vv)
 12 {
 13     edge[++cnt].begin=bb;edge[cnt].end=ee;edge[cnt].value=vv;edge[cnt].next=Head[bb];Head[bb]=cnt;
 14 }
 15 void addedge1(int bb,int ee,int vv)
 16 {
 17     addedge(bb,ee,vv);addedge(ee,bb,vv);
 18 }
 19 void Push1(int k)
 20 {
 21     int now=k,root;
 22     while(now>1)
 23     {
 24         root=now/2;
 25         if(dis[Heap[root]]<=dis[Heap[now]])return;
 26         swap(Heap[root],Heap[now]);
 27         swap(pos[Heap[root]],pos[Heap[now]]);
 28         now=root;
 29     }
 30 }
 31 void Insert(int k)
 32 {
 33     Heap[++SIZE]=k;pos[k]=SIZE;Push1(SIZE);
 34 }
 35 void Pop1(int k)
 36 {
 37     int now,root=k;
 38     pos[Heap[k]]=0;Heap[k]=Heap[SIZE--];if(SIZE>0)pos[Heap[k]]=k;
 39     while(root<=SIZE/2)
 40     {
 41         now=root*2;
 42         if(now<SIZE&&dis[Heap[now+1]]<dis[Heap[now]])now++;
 43         if(dis[Heap[root]]<=dis[Heap[now]])return;
 44         swap(Heap[root],Heap[now]);
 45         swap(pos[Heap[root]],pos[Heap[now]]);
 46         root=now;
 47     }
 48 }
 49 int dijkstra(int start)
 50 {
 51     int i,u,v;
 52     for(i=1;i<=N;i++)dis[i]=INF;dis[start]=0;
 53     for(i=1;i<=N;i++)Insert(i);
 54     while(SIZE>0)
 55     {
 56         u=Heap[1];Pop1(pos[u]);
 57         for(i=Head[u];i!=-1;i=edge[i].next)
 58         {
 59             v=edge[i].end;
 60             if(dis[v]>dis[u]+edge[i].value){dis[v]=dis[u]+edge[i].value;Push1(pos[v]);}
 61         }
 62     }
 63     return dis[N];
 64 }
 65 int main()
 66 {
 67     int n,i,j,ans;
 68     char a;
 69     scanf("%d %d",&n,&m);
 70     N=(n+1)*(m+1);
 71     memset(Head,-1,sizeof(Head));cnt=1;
 72     for(i=1;i<=n;i++)
 73     {
 74         scanf("\n");
 75         for(j=1;j<=m;j++)
 76         {
 77             scanf("%c",&a);
 78             if(a=='/')
 79             {
 80                 addedge1(xy(i,j),xy(i+1,j+1),1);
 81                 addedge1(xy(i+1,j),xy(i,j+1),0);
 82                 //addedge1(xy(i,j),xy(i+1,j+1),0);
 83                 //addedge1(xy(i+1,j),xy(i,j+1),1);
 84             }
 85             else
 86             {
 87                 //addedge1(xy(i,j),xy(i+1,j+1),1);
 88                 //addedge1(xy(i+1,j),xy(i,j+1),0);
 89                 addedge1(xy(i,j),xy(i+1,j+1),0);
 90                 addedge1(xy(i+1,j),xy(i,j+1),1);
 91             }
 92         }
 93     }
 94     ans=dijkstra(1);
 95     if(ans==INF)printf("NO SOLUTION");
 96     else printf("%d",ans);
 97     fclose(stdin);
 98     fclose(stdout);
 99     return 0;
100 }

 

posted @ 2016-03-27 20:56  微弱的世界  阅读(191)  评论(0编辑  收藏  举报