Cod sursa(job #1026939)

Utilizator alecsandrualex cuturela alecsandru Data 12 noiembrie 2013 11:59:06
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
#include<queue>
#include<vector>
const int MAX_N=50000;
const int MAX_M=250000;
const int INF=0x7fffffff;
//0111 1111 1111 1111 1111 1111 1111 1111
using namespace std;
struct Nod
{
    int cost,nod;
};
int cost[MAX_N + 1],n,m,i,a,b,c;
bool incoada[MAX_N + 1];
vector <Nod> vecini[MAX_N + 1];
queue <Nod> q;
Nod temp,fiu;
int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        cost[i]=INF;
        incoada[i]=false;
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        temp.cost=c;
        temp.nod=b;
        vecini[a].push_back(temp);
    }
    temp.nod=1;
    temp.cost=0;
    q.push(temp);
    cost[1]=0;
    incoada[1]=true;
    while(!q.empty())
    {
        temp=q.front();
        q.pop();
        incoada[temp.nod]=false;
        for(i=0;i<vecini[temp.nod].size();i++)
        {
            fiu.cost=temp.cost+vecini[temp.nod][i].cost;
            fiu.nod=vecini[temp.nod][i].nod;
            if(cost[fiu.nod]>fiu.cost)
            {
                cost[fiu.nod]=fiu.cost;
                if(!incoada[fiu.nod])
                {
                    incoada[fiu.nod]=true;
                    q.push(fiu);
                }
            }
        }
    }
    for(i=2;i<=n;i++)
    {
        if(cost[i]!=INF)
            printf("%d ",cost[i]);
        else
            printf("0 ");
    }
    return 0;
}