Cod sursa(job #1638279)

Utilizator alex.vasiuVasiu Alexandru alex.vasiu Data 7 martie 2016 22:12:31
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#include <set>
using namespace std;
vector <pair<int,int>> G[50005];
int n,m,a,b,c;
const int64_t INF = 1e9;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
/*void dfs(int nod)
{
    cout<<nod<<" ";
    viz[nod]=1;
    for(int i=0;i<G[nod].size();i++)
        if(!viz[G[nod][i]])
       dfs(G[nod][i]);
}*/
void dijkstra(int start)
{
    vector <bool> mark(n+1,false);
    vector <int64_t> dist(n+1,INF);
    dist[start]=0;
    //mark[start]=1;
   int u;
	/*set<pair<int,int> > s;
	s.insert({dist[start], start});
    while(!s.empty())
    {
        u = s.begin() -> second;
        s.erase(s.begin());
        for(auto p : G[u])
            if(dist[p.first]>dist[u]+p.second)
        {
            s.erase({dist[p.first],p.first});
            dist[p.first]=dist[u]+p.second;
            s.insert({dist[p.first],p.first});

        }
    }*/
priority_queue<pair<int,int>,vector<pair<int,int> >, less<pair<int,int> > > pq;
	pq.push({dist[start], start});
	while(!pq.empty()){
		u = pq.top().second;
		pq.pop();
		if(mark[u])
			continue;
		mark[u] = true;
		for(auto p : G[u]) //adj[v][i] = pair(vertex, weight)
			if(dist[p.first] > dist[u] + p.second){
				dist[p.first] = dist[u] + p.second;
				pq.push({dist[p.first], p.first});
			}
	}
    for(int i=2;i<=n;i++)
        if(dist[i]!=INF)
        g<<dist[i]<<" ";
    else
        g<<"0 ";
}
int main()
{

    f>>n>>m;
    for(int i=0; i<m; i++)
    {
        f>>a>>b>>c;
        G[a].push_back(make_pair(b,c));
        G[b].push_back(make_pair(a,c));
    }

 dijkstra(1);
}