| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:原来dijkstra加堆优化也可以过的(附代码)In Reply To:原来dijkstra加堆优化也可以过的(附代码) Posted by:hustpd2 at 2009-08-13 22:00:43 > #include<stdio.h>
> #include<string.h>
> #define MAX 301
> int xs,ys,xe,ye,l;
> int mark[MAX][MAX];
> typedef struct
> {
> int col,row;
> int key;
> }heapelem;
> heapelem node[MAX*MAX];
> int size;
>
> void change(int a,int b)
> {
> int temp;
> temp=mark[node[a].row][node[a].col];
> mark[node[a].row][node[a].col]=mark[node[b].row][node[b].col];
> mark[node[b].row][node[b].col]=temp;
>
>
> heapelem t;
> t=node[a];
> node[a]=node[b];
> node[b]=t;
> }
>
> void heapup(int id)
> {
> int i=id;
> while(i>1)
> {
> if(node[i].key>=node[i>>1].key) break;
> else
> {
> change(i,i>>1);
> i=i>>1;
> }
> }
> }
>
> void heapdown(int id)
> {
> int i=id;
> int temp;
> while(2*i<=size)
> {
> if(2*i==size) temp=2*i;
> else temp=node[2*i].key<node[2*i+1].key?2*i:(2*i+1);
> change(temp,i);
> i=temp;
> }
> }
> void heapinsert(heapelem data)
> {
> size++;
> node[size]=data;
> heapup(size);
> }
>
> int heappop()
> {
> change(1,size);
> size--;
> heapdown(1);
> return size+1;
> }
>
> void heapdelete(int id)
> {
> change(id,size);
> size--;
> heapdown(id);
> }
>
> void heapmodify(heapelem data,int id)
> {
> if(node[id].key<=data.key) {
> node[id]=data;
> heapdown(id);}
> if(node[id].key>data.key) {
> node[id]=data;
> heapup(id);}
> }
> void init()
> {
> scanf("%d",&l);
> scanf("%d %d",&xs,&ys);
> scanf("%d %d",&xe,&ye);
> }
>
> void solve()
> {
> int visit[MAX][MAX];
> int dist[MAX][MAX];
> memset(visit,0,sizeof(visit));
> for(int i=0;i<l;i++)
> for(int j=0;j<l;j++)
> dist[i][j]=100000;
> dist[xs][ys]=0;
> size=0;
> int m=xs,n=ys;
> heapelem temp;
> for(int i=1;i<l*l;i++)
> {
> visit[m][n]=1;
> if(m+2<l&&n+1<l&&!visit[m+2][n+1]&&dist[m+2][n+1]>dist[m][n]+1)
> {
> dist[m+2][n+1]=dist[m][n]+1;
> temp.key=dist[m+2][n+1];
> temp.row=m+2;
> temp.col=n+1;
> heapinsert(temp);
> }
> if(m+1<l&&n+2<l&&!visit[m+1][n+2]&&dist[m+1][n+2]>dist[m][n]+1)
> {
> dist[m+1][n+2]=dist[m][n]+1;
> temp.key=dist[m+1][n+2];
> temp.row=m+1;
> temp.col=n+2;
> heapinsert(temp);
> }
> if(m-2>=0&&n+1<l&&!visit[m-2][n+1]&&dist[m-2][n+1]>dist[m][n]+1)
> {
> dist[m-2][n+1]=dist[m][n]+1;
> temp.key=dist[m-2][n+1];
> temp.row=m-2;
> temp.col=n+1;
> heapinsert(temp);
> }
> if(m+2<l&&n-1>=0&&!visit[m+2][n-1]&&dist[m+2][n-1]>dist[m][n]+1)
> {
> dist[m+2][n-1]=dist[m][n]+1;
> temp.key=dist[m+2][n-1];
> temp.row=m+2;
> temp.col=n-1;
> heapinsert(temp);
> }
> if(m-2>=0&&n-1>=0&&!visit[m-2][n-1]&&dist[m-2][n-1]>dist[m][n]+1)
> {
> dist[m-2][n-1]=dist[m][n]+1;
> temp.key=dist[m-2][n-1];
> temp.row=m-2;
> temp.col=n-1;
> heapinsert(temp);
> }
> if(m-1>=0&&n+2<l&&!visit[m-1][n+2]&&dist[m-1][n+2]>dist[m][n]+1)
> {
> dist[m-1][n+2]=dist[m][n]+1;
> temp.key=dist[m-1][n+2];
> temp.row=m-1;
> temp.col=n+2;
> heapinsert(temp);
> }
> if(m+1<l&&n-2>=0&&!visit[m+1][n-2]&&dist[m+1][n-2]>dist[m][n]+1)
> {
> dist[m+1][n-2]=dist[m][n]+1;
> temp.key=dist[m+1][n-2];
> temp.row=m+1;
> temp.col=n-2;
> heapinsert(temp);
> }
> if(m-1>=0&&n-2>=0&&!visit[m-1][n-2]&&dist[m-1][n-2]>dist[m][n]+1)
> {
> dist[m-1][n-2]=dist[m][n]+1;
> temp.key=dist[m-1][n-2];
> temp.row=m-1;
> temp.col=n-2;
> heapinsert(temp);
> }
> while(1)
> {
> int a=heappop();
> m=node[a].row;
> n=node[a].col;
> if(!visit[m][n]) break;
> }
> if(m==xe&&n==ye)
> {
> printf("%d\n",dist[m][n]);
> return ;
> }
> }
> printf("%d\n",dist[xe][ye]);
> }
>
> int main()
> {
> int t;
> scanf("%d",&t);
> while(t--)
> {
> init();
> solve();
> }
> }
>
>
>
>
>
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator