[shkola] zad A2 - reshenie

  • From: Bono Nonchev <madcow@xxxxxx>
  • To: shkola@xxxxxxxxxxxxx
  • Date: Mon, 24 Nov 2003 01:17:22 +0200 (EET)

eto reshenieto na chase-a.
ne sym iztril izlishniq kod kato void dijkstra(int a), obache vqrvam che raboti 
vqrno... pone testoviq primer hvana. utre shte si poigraq da navra i piramida. 
inache mai mnojko funkcii sym pisal. za okolo 2 chasa go napisah dotuk?!
da ne vi pravi vpechatlenie izhoda. gledaite samo poslednoto chislo. 
slojnostta, uvi, e N^4. 

//chase

#include "iostream.h"
#include "conio.h"
#include "stdlib.h"

#define MAXVALUE 100000
#define min(a,b) ((a)<(b)?(a):(b))

int M,N,K,DS;
int bf[100][100];
int al[50][2];
int distg[10000], visg[10000];
int dist[10000], vis[10000];
int lastmanstanding=0;

// heap[10000];

int gj(int a)
{return a%M;}

int gi(int a)
{return a/M;}

int gc(int i, int j)
{return i*M+j;}

int price(int a)
{return bf[gi(a)][gj(a)];}

int adj(int a, int b)
{
        int i1=gi(a), j1=gj(a), i2=gi(b), j2=gj(b);
        if(bf[i1][j1]==MAXVALUE||bf[i2][j2]==MAXVALUE)
                return MAXVALUE;
        else if((i1%2)==0)
        {
                
if((i1==(i2+1)&&j1==(j2+1))||(i1==(i2+2)&&j1==(j2))||(i1==(i2+1)&&j1==(j2))||
                   
(i1==(i2-1)&&j1==(j2))||(i1==(i2-2)&&j1==(j2))||(i1==(i2-1)&&j1==(j2+1)))
                   return bf[i1][j1];
        }
        else
        {
                
if((i1==(i2+1)&&j1==(j2))||(i1==(i2+2)&&j1==(j2))||(i1==(i2+1)&&j1==(j2-1))||
                   
(i1==(i2-1)&&j1==(j2-1))||(i1==(i2-2)&&j1==(j2))||(i1==(i2-1)&&j1==(j2)))
                   return bf[i1][j1];
        }
        return MAXVALUE;
}

/*int ttreach(int distv, int v)
{
        return ((distv+price(v)<=dist[v]) ? distv : MAXVALUE);
}*/

void dijkstra(int a)
{
        int i;
        for(i=0;i<DS;i++)
        {
                dist[i]=adj(a,i);
                vis[i]=0;
        }
        dist[a]=0;
        vis[a]=1;
        int mindist, u;
        while(1)
        {
                mindist=MAXVALUE;
                for(i=0;i<DS;i++)
                        if(!vis[i]&&dist[i]<mindist)
                        {
                                mindist=dist[i];
                                u=i;
                        }
                if(mindist==MAXVALUE) break;
                vis[u]=1;
                for(i=0;i<DS;i++)
                        dist[i]=min(dist[i], dist[u]+adj(u,i));         
        }
}

void dijkstrag(int a)
{
        int i;
        for(i=0;i<DS;i++)
        {
                distg[i]=(adj(a,i)<=dist[a] ? adj(a,i) : MAXVALUE);
                visg[i]=0;
        }
        distg[a]=0;
        visg[a]=1;
        int mindist, u, tdist;
        while(1)
        {
                mindist=MAXVALUE;
                for(i=0;i<DS;i++)
                        if(!visg[i]&&distg[i]<mindist)
                        {
                                mindist=distg[i];
                                u=i;
                        }
                if(mindist==MAXVALUE) break;
                visg[u]=1;
                for(i=0;i<DS;i++)
                {
                        tdist=min(distg[i], distg[u]+adj(u,i));
                        
if(lastmanstanding<dist[i]&&dist[i]!=MAXVALUE&&tdist!=MAXVALUE)
                                lastmanstanding=dist[i];
                        distg[i]=(tdist<=dist[i]? tdist : MAXVALUE);
                }
        }
}

void dijkstral()
{
        int i,j;
        for(i=0;i<DS;i++)
        {
                dist[i]=MAXVALUE;
                vis[i]=0;
        }
        for(j=0;j<K;j++)
        {
                for(i=0;i<DS;i++)
                {
                        dist[i]=min(dist[i], adj(gc(al[j][0], al[j][1]),i));
                }
                vis[gc(al[j][0], al[j][1])]=1;
                dist[gc(al[j][0], al[j][1])]=0;
        }
        int mindist, u;
        while(1)
        {
                mindist=MAXVALUE;
                for(i=0;i<DS;i++)
                        if(!vis[i]&&dist[i]<mindist)
                        {
                                mindist=dist[i];
                                u=i;
                        }
                if(mindist==MAXVALUE) break;
                vis[u]=1;
                for(i=0;i<DS;i++)
                        dist[i]=min(dist[i], dist[u]+adj(u,i));         
        }

}


int main()
{
        int i,j,x,y;
        char c[100];
        cin>>N>>M>>K;
        DS=M*N;
        for(i=0;i<100;i++)
                for(j=0;j<100;j++)
                        bf[i][j]=MAXVALUE;
        for(i=0;i<N;i++)
        {
                cin>>c;
                for(j=0;j<M;j++)
                        if(c[j]!='X')
                                bf[i][j]=c[j]-'0';
        }

        cin>>x>>y;
        x--;
        y--;
        for(i=0;i<K;i++)
        {
                cin>>al[i][0]>>al[i][1];
                al[i][0]--;
                al[i][1]--;
        }

        for(i=0;i<DS;i++)
        {
                for(j=0;j<DS;j++)
                        cout<<(adj(i,j)==MAXVALUE ? 0 : adj(i,j))<<' ';
                cout<<'\n';
        }
    dijkstra(gc(al[0][0],al[0][1]));
        cout<<'\n';
        for(i=0;i<DS;i++)
                cout<<dist[i]<<' ';
    dijkstra(gc(al[1][0],al[1][1]));
        cout<<'\n';
        for(i=0;i<DS;i++)
                cout<<dist[i]<<' ';
        dijkstral();
        cout<<'\n';
        for(i=0;i<DS;i++)
                cout<<dist[i]<<' ';
        dijkstrag(gc(x,y));
        cout<<'\n';
        for(i=0;i<DS;i++)
                cout<<distg[i]<<' ';
        cout<<'\n';
        /////////////////////////////
        cout<<lastmanstanding;
        return 0;
}

-----------------------------------------------------------------
http://www.sosbg.org - Направете още едно дете щастливо - 0881722 -  за тях!

Other related posts:

  • » [shkola] zad A2 - reshenie