Cod sursa(job #901579)

Utilizator andrettiAndretti Naiden andretti Data 1 martie 2013 10:49:47
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<stdio.h>
#include<vector>
using namespace std;

const int maxn=200005,inf=99999999;
int n,m,nh,cost;
int x[maxn],d[maxn],poz[maxn];
vector < pair<int,int> > l[maxn];

void cit()
{
    int i;
    int a,b,c;

    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        l[a].push_back(make_pair(b,c));
        l[b].push_back(make_pair(a,c));

    }

	for(i=1;i<=n;i++)
	{
		x[i]=i;
		poz[i]=i;
		d[i]=inf;
	}
    nh=n;
    d[1]=0;
}

void swap(int i,int j)
{
    int aux;
    aux=x[i];
    x[i]=x[j];
    x[j]=aux;
    poz[x[i]]=i;
    poz[x[j]]=j;
}

void heap_up(int k)
{
    int i;
    if(k<=1) return;

    i=k/2;
    if(d[x[i]]>d[x[k]])
    {
        swap(i,k);
        heap_up(i);
    }
}

void heap_dw(int k)
{
    int i=2*k;

    if(i<=nh)
    {
        if(i+1<=nh && d[x[i+1]]<d[x[i]]) i++;

        if(d[x[i]]<d[x[k]])
        {
            swap(i,k);
            heap_dw(i);
        }
    }
}

int min_heap()
{
    swap(1,nh);
    poz[x[nh]]=0;
    nh--;

    return x[nh+1];
}

void dijkstra()
{
    int nod;

    while(nh>0)
    {
        nod=min_heap();
        heap_dw(1);

        cost+=d[nod];
        for(unsigned int i=0;i<l[nod].size();i++)
            if(poz[l[nod][i].first] && d[nod]+l[nod][i].second<d[l[nod][i].first])
            {
                d[l[nod][i].first]=d[nod]+l[nod][i].second;
                heap_up(poz[l[nod][i].first]);
            }
    }
}

void afis()
{
    int i;

    for(i=2;i<=n;i++)
        if(d[i]==inf) printf("0 ");
        else
        printf("%d ",d[i]);

}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);

    cit();
    dijkstra();
    afis();

    fclose(stdin);
    fclose(stdout);
    return 0;
}