diff --git a/Graph/Dijkstra.cpp b/Graph/Dijkstra.cpp new file mode 100644 index 000000000..c395cd527 --- /dev/null +++ b/Graph/Dijkstra.cpp @@ -0,0 +1,49 @@ +#include +#include +#include +#include +using namespace std; +#define INF 10000010 +vector < pair > graph[5*100001]; +int dis[5*100001]; +int dij(vector > * v,int s,int * dis) { + priority_queue < pair , vector < pair >,greater < pair > > pq; + // source distance to zero. + pq.push(make_pair(0,s)); + dis[s] = 0; + int u; + while(!pq.empty()) { + u = (pq.top()).second; + pq.pop(); + for( vector > :: iterator it = v[u].begin(); it != v[u].end();it++) { + if(dis[u] + it->first < dis[it->second]) { + dis[it->second] = dis[u] + it->first; + pq.push(make_pair(dis[it->second],it->second)); + } + } + } +} +int main() { + int m,n,l,x,y,s; + // n--> number of nodes , m --> number of edges + cin>>n>>m; + for(int i = 0;i < m;i++) { + // input edges. + scanf("%d%d%d",&x,&y,&l); + graph[x].push_back(make_pair(l,y)); + graph[y].push_back(make_pair(l,x)); // comment this line for directed graph + } + // start node. + scanf("%d",&s); + // intialise all distances to infinity. + for(int i = 1;i <= n;i++) + dis[i] = INF; + dij(graph,s,dis); + + for(int i = 1;i <= n;i++) + if(dis[i] == INF) + cout<<"-1 "; + else + cout<