最短路模板

it2022-05-05  190

#include<iostream> #include<map> #include<queue> #include<string.h> #include<vector> #include<string> #include<algorithm> #include <cstring> using namespace std; map<string, int> name; struct Edge { int weight; int end, next; Edge() {} Edge(int e, int w, int n = 0) { end = e; weight = w; next = n; } bool operator<(const Edge &a) const { return (a.weight == weight ? end > a.end : weight > a.weight); } }; const int M = int(1e5 + 10); const int INF = 0x3f3f3f3f; const int N = 1001; struct Gragh { Edge eg[M]; int cnt, head[N]; bool vis[N]; void init() { cnt = 0; memset(head, -1, sizeof(head)); } void addEdge(int i, int j, int v) { eg[cnt] = Edge(j, v, head[i]); head[i] = cnt; cnt++; } } gh1, gh2; int path[N]; int dis[N]; void dijkstra(Gragh &gh, int src, int m) { for (int i = 0; i <= m + 1; i++) { dis[i] = INF; } memset(path, -1, sizeof(path)); dis[src] = 0; path[src] = src; priority_queue<Edge> q; q.push(Edge(src, dis[src])); while (!q.empty()) { Edge f = q.top(); q.pop(); for (int i = gh.head[f.end]; i != -1; i = gh.eg[i].next) { Edge &t = gh.eg[i]; if (dis[t.end] > f.weight + t.weight) { dis[t.end] = f.weight + t.weight; path[t.end] = f.end; q.push(Edge(t.end, dis[t.end])); } } } } #include<iostream> #include<map> #include<queue> #include<string.h> #include<vector> #include<string> using namespace std; map<string, int>name; double dis[1040]; int cnt, head[1040]; bool vis[1040]; struct Edge { double weight; int end,next; Edge() {} Edge(int e,double w,int n) { end = e; weight = w; next = n; } }; Edge eg[1040]; void init() { cnt = 0; memset(head, -1, sizeof(head)); } void addEdge(int i, int j, double v) { eg[cnt] = Edge(j, v, head[i]); head[i] = cnt; cnt++; } void SPFA(int src, int m) { for (int i = 0; i < m; i++) { dis[i] = vis[i] = 0; } queue<int>Q; int q; vis[src] = 1; dis[src] = 1; Q.push(src); while (!Q.empty()) { q = Q.front(); Q.pop(); vis[q] = 0; for (int i=head[q];i!=-1;i=eg[i].next) { if (dis[eg[i].end] < dis[q] * eg[i].weight) { dis[eg[i].end] = dis[q] * eg[i].weight; if (dis[src] > 1) return; if (!vis[eg[i].end]) { vis[eg[i].end] = 1; Q.push(eg[i].end); } } } } }

 


最新回复(0)