Cod sursa(job #1747371)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 24 august 2016 20:21:56
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

int n,m,i,j;
int costminim[50010];

class comp
{
public:
    bool operator() (int a, int b)
    {
        if (costminim[a]==costminim[b])
            return a<b;
        return costminim[a]<costminim[b];
    }
};

priority_queue <int> q;
vector <int> v[50010],cost[50010];

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1; i<=m; i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        v[a].push_back(b);
        cost[a].push_back(c);
    }
    for (i=2; i<=n; i++)
        costminim[i]=50000001;
    q.push(1);
    while (!q.empty())
    {
        int x=q.top();
        q.pop();
        for (i=0; i<v[x].size(); i++)
            if (costminim[x]+cost[x][i]<costminim[v[x][i]])
            {
                costminim[v[x][i]]=cost[x][i]+costminim[x];
                q.push(v[x][i]);
            }
    }
    for (i=2; i<=n; i++)
        if (costminim[i]!=50000001)
            printf("%d ",costminim[i]);
        else printf("0 ");
    printf("\n");
}

// DIJKSTRA CU SET
//#include <cstdio>
//#include <set>
//#include <vector>
//
//using namespace std;
//
//int n,m,i,j;
//int costminim[50010];
//
//vector <int> v[50010],cost[50010];
//
//class comp
//{
//public:
//    bool operator() (int a, int b)
//    {
//        if (costminim[a]==costminim[b])
//            return a<b;
//        return costminim[a]<costminim[b];
//    }
//};
//
//set <int,comp> s;
//
//int main()
//{
//    freopen("dijkstra.in","r",stdin);
//    freopen("dijkstra.out","w",stdout);
//    scanf("%d%d",&n,&m);
//    for (i=1; i<=m; i++)
//    {
//        int a,b,c;
//        scanf("%d%d%d",&a,&b,&c);
//        v[a].push_back(b);
//        cost[a].push_back(c);
//    }
//    for (i=2; i<=n; i++)
//        costminim[i]=50000001;
//    s.insert(1);
//    while (!s.empty())
//    {
//        int x=*s.begin();
//        s.erase(x);
//        for (i=0; i<v[x].size(); i++)
//            if (costminim[x]+cost[x][i]<costminim[v[x][i]])
//            {
//                s.erase(v[x][i]);
//                costminim[v[x][i]]=costminim[x]+cost[x][i];
//                s.insert(v[x][i]);
//            }
//    }
//    for (i=2; i<=n; i++)
//        if (costminim[i]!=50000001)
//            printf("%d ",costminim[i]);
//        else printf("0 ");
//    printf("\n");
//    return 0;
//}