#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;
class Graph{
int V;
vector<int> *adj;
public:
Graph(int V);
void AddEdge(int v, int w);
void Dijkstra(int src);
int MinDistance(int dist[], bool sptset[]);
void PrintGraph(int dist[], int n);
};
Graph::Graph(int V){ // construtor
this->V = V;
adj = new vector<int> [V];
}
void Graph::AddEdge(int v, int w){
if(v >= 0 && v< V)
adj[v].push_back(w);
}
int Graph::MinDistance(int dist[], bool sptset[]){
int min = INT_MAX, min_index;
for(int v=0;v<V;v++)
if(sptset[v] == false && dist[v] <= min)
min = dist[v], min_index = v;
return min_index;
}
void Graph::PrintGraph(int dist[], int n){
for(int i=0;i<n;i++)
cout<<i<<" "<<dist[i]<<endl;
}
void Graph::Dijkstra(int src){
int dist[V];
bool sptset[V];
for(int i=0;i<V;i++)
dist[i] = INT_MAX, sptset[i] = false;
dist[src] = 0;
//find shortest path for all vertices
for(int count=0; count< V-1;count++){
int u = MinDistance(dist,sptset);
sptset[u] = true;
//update dist value of the ajacent vertices
for(int v=0;v<adj[u].size();v++){
if(!sptset[v] && adj[u][v] && dist[u] != INT_MAX
&& dist[u] + adj[u][v] < dist[v])
dist[v] = dist[u] + adj[u][v];
}
}
PrintGraph(dist,V);
}
int main(){
Graph g(3);
g.AddEdge(0,2);
g.AddEdge(0,3);
g.Dijkstra(0);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGltaXRzLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgR3JhcGh7CiAgaW50IFY7CiAgdmVjdG9yPGludD4gKmFkajsKCiAgcHVibGljOgogICAgR3JhcGgoaW50IFYpOwogICAgdm9pZCBBZGRFZGdlKGludCB2LCBpbnQgdyk7CiAgICB2b2lkIERpamtzdHJhKGludCBzcmMpOwogICAgaW50IE1pbkRpc3RhbmNlKGludCBkaXN0W10sIGJvb2wgc3B0c2V0W10pOwogICAgdm9pZCBQcmludEdyYXBoKGludCBkaXN0W10sIGludCBuKTsKfTsKCkdyYXBoOjpHcmFwaChpbnQgVil7ICAgICAgLy8gY29uc3RydXRvcgogIHRoaXMtPlYgPSBWOwogIGFkaiA9IG5ldyB2ZWN0b3I8aW50PiBbVl07Cn0KCnZvaWQgR3JhcGg6OkFkZEVkZ2UoaW50IHYsIGludCB3KXsKICBpZih2ID49IDAgJiYgdjwgVikKICAgIGFkalt2XS5wdXNoX2JhY2sodyk7Cn0KCmludCBHcmFwaDo6TWluRGlzdGFuY2UoaW50IGRpc3RbXSwgYm9vbCBzcHRzZXRbXSl7CiAgaW50IG1pbiA9IElOVF9NQVgsIG1pbl9pbmRleDsKCiAgZm9yKGludCB2PTA7djxWO3YrKykKICAgIGlmKHNwdHNldFt2XSA9PSBmYWxzZSAmJiBkaXN0W3ZdIDw9IG1pbikKICAgICAgbWluID0gZGlzdFt2XSwgbWluX2luZGV4ID0gdjsKCiAgcmV0dXJuIG1pbl9pbmRleDsKfQoKdm9pZCBHcmFwaDo6UHJpbnRHcmFwaChpbnQgZGlzdFtdLCBpbnQgbil7CiAgZm9yKGludCBpPTA7aTxuO2krKykKICAgIGNvdXQ8PGk8PCIgIjw8ZGlzdFtpXTw8ZW5kbDsKfQoKdm9pZCBHcmFwaDo6RGlqa3N0cmEoaW50IHNyYyl7CiAgaW50IGRpc3RbVl07CiAgYm9vbCBzcHRzZXRbVl07CgogIGZvcihpbnQgaT0wO2k8VjtpKyspCiAgICBkaXN0W2ldID0gSU5UX01BWCwgc3B0c2V0W2ldID0gZmFsc2U7CgogIGRpc3Rbc3JjXSA9IDA7CgogIC8vZmluZCBzaG9ydGVzdCBwYXRoIGZvciBhbGwgdmVydGljZXMKICBmb3IoaW50IGNvdW50PTA7IGNvdW50PCBWLTE7Y291bnQrKyl7CiAgICBpbnQgdSA9IE1pbkRpc3RhbmNlKGRpc3Qsc3B0c2V0KTsKCiAgICBzcHRzZXRbdV0gPSB0cnVlOwoKICAgIC8vdXBkYXRlIGRpc3QgdmFsdWUgb2YgdGhlIGFqYWNlbnQgdmVydGljZXMgCiAgICBmb3IoaW50IHY9MDt2PGFkalt1XS5zaXplKCk7disrKXsKICAgICAgaWYoIXNwdHNldFt2XSAmJiBhZGpbdV1bdl0gJiYgZGlzdFt1XSAhPSBJTlRfTUFYIAogICAgICAgICAgJiYgZGlzdFt1XSArIGFkalt1XVt2XSA8IGRpc3Rbdl0pCiAgICAgICAgZGlzdFt2XSA9IGRpc3RbdV0gKyBhZGpbdV1bdl07CiAgICB9CiAgfQogIFByaW50R3JhcGgoZGlzdCxWKTsKfQoKaW50IG1haW4oKXsKICBHcmFwaCBnKDMpOwogIGcuQWRkRWRnZSgwLDIpOwogIGcuQWRkRWRnZSgwLDMpOwogIGcuRGlqa3N0cmEoMCk7CiAgcmV0dXJuIDA7Cn0=