Cod sursa(job #389956)

Utilizator ZeKalangaCiocan Alin ZeKalanga Data 2 februarie 2010 16:38:55
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#define inf 100


using namespace std;

int n,mat[10000][10000],r;

void citire()
{
    freopen("dijkstra.in","r",stdin);


    int m;
    scanf("%d%d",&n,&m);

    for(int i=1;i<=n;i++)
           for(int j=1;j<=n;j++)
                {
                    if(i==j) mat[i][j]=0;
                    else mat[i][j]=inf;

                }



    for(int i=1;i<=m;i++)
        {
            int x,y,c;


            scanf("%d%d%d",&x,&y,&c);

            mat[x][y]=c;
        }
    r=1;


}


int d[100],t[100],s[100];

void dijkstra()
{


    for(int i=1;i<=n;i++)
        {
            d[i]=mat[r][i];
            if(r!=i) t[i]=r;
        }

    s[r]=1;
    t[r]=0;
    int dmin,poz;
    for(int i=1;i<=n-1;i++)
        {
            dmin=inf;
                for(int j=1;j<=n;j++)
                    if(s[j]==0&&dmin>d[j])
                        {
                            dmin=d[j];
                            poz=j;
                        }


        s[poz]=1;
        for(int j=1;j<=n;j++)
            if(s[j]==0&&d[j]>d[poz]+mat[poz][j])
                {
                    d[j]=d[poz]+mat[poz][j];
                    t[j]=poz;
                }



        }

}

void drumuri()
{
      freopen("dijkstra.out","w",stdout);

    int dr[100],l;
    for(int i=1;i<=n;i++)
        {
            if(i!=r)
                {
                    if(d[i]==inf) printf("0");
                    else
                        {

                            printf("%d ",d[i]);

                        }
                }
        }
}


int main()
{
    citire();

    dijkstra();

    drumuri();

    return 0;
}