title

🧩 Syntax:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f

struct Vertex {
    int x, y;

    Vertex(int x, int y) : x(x), y(y) {}
};

typedef pair<double, int> iPair;

class Graph {
    int V;
    vector<Vertex> vertices;
    vector<vector<double>> edgeWeights;

public:
    Graph(int V);
    void addVertex(int x, int y);
    void addEdge(int u, int v);
    double euclideanDistance(const Vertex& u, const Vertex& v);
    void shortestPath(int src);
};

Graph::Graph(int V) {
    this->V = V;
    edgeWeights.resize(V, vector<double>(V, INF));
}

void Graph::addVertex(int x, int y) {
    vertices.emplace_back(x, y);
}

void Graph::addEdge(int u, int v) {
    double weight = euclideanDistance(vertices[u], vertices[v]);
    edgeWeights[u][v] = weight;
    edgeWeights[v][u] = weight;
}

double Graph::euclideanDistance(const Vertex& u, const Vertex& v) {
    return sqrt(pow(u.x - v.x, 2) + pow(u.y - v.y, 2));
}

void Graph::shortestPath(int src) {
    priority_queue<iPair, vector<iPair>, greater<iPair>> pq;
    vector<double> dist(V, INF);

    pq.push(make_pair(0, src));
    dist[src] = 0;

    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();

        for (int v = 0; v < V; ++v) {
            if (edgeWeights[u][v] != INF && dist[v] > dist[u] + edgeWeights[u][v]) {
                dist[v] = dist[u] + edgeWeights[u][v];
                pq.push(make_pair(dist[v], v));
            }
        }
    }

    printf("Vertex Distance from Source\n");
    for (int i = 0; i < V; ++i)
        printf("Vertex %d: %.2lf\n", i, dist[i]);

    int destination;
    cout << "Enter your preferred destination vertex: ";
    cin >> destination;

    if (dist[destination] == INF) {
        cout << "No path exists from source to destination." << endl;
    } else {
        cout << "Shortest distance from source to destination: " << dist[destination] << endl;
    }
}

int main() {
    int V = 4;
    Graph g(V);

    g.addVertex(1, 1);
    g.addVertex(1, 5);
    g.addVertex(5, 1);
    g.addVertex(5, 5);

    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(0, 3);
    g.addEdge(1, 3);
    g.addEdge(0, 2);

    int source;
    cout << "Enter the source vertex: ";
    cin >> source;
    cout << endl;
    g.shortestPath(source);
    cout<<"\n";
    return 0;
}