Bzoj 2346: [Baltic 2011]Lamp dijkstra,堆
2346: [Baltic 2011]Lamp
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 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 }