dijkstra + spfa
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; #define INF 0x3f3f3f int cnt=0,head[INF],dis[INF]; int n,m; struct edge{ int v; int next; int w; }e[INF]; int add(int u,int v,int w){ e[++cnt].v = v; e[cnt].w = w; e[cnt].next = head[u]; head[u] = cnt; } struct node{ int d,u; bool operator <(const node &rhs) const { return d > rhs.d; } }; inline void dij(){ memset(dis,0x3f3f,sizeof(dis)); dis[1] = 0; priority_queue<node> q; q.push((node){1,0}); while(!q.empty()) { node fr = q.top(); q.pop(); int u = fr.u; int d = fr.d; if(d != dis[u]) continue; for(int i = head[u];i; i = e[i].next) { int v = e[i].v; int w = e[i].w; if(dis[u] + w < dis[v]) { dis[v] = dis[u] + w; q.push((node){v,dis[v]}); } } } } int main(){ scanf("%d%d",&n,&m); for(int i = 1;i <= m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } dij(); printf("%d\n",dis[n]); return 0; }
spfa
int spfa(){ int che[INF],dis[INF]; memset(che,0,sizeof(che)); memset(dis,0x3f3f,sizeof(dis)); dis[1] = 0; che[1] = 1; queue<node> q; q.push((node){1,0}); while(!q.empty()) { node fr = q.front(); q.pop(); che[fr.u] = 0; int u = fr.u; int d = fr.d; for(int i=head[u];i;i=e[i].next) { int v = e[i].v; int w = e[i].w; if(dis[v] > dis[u] + w){ dis[v] = dis[u] + w; if(!che[v]){ che[v] = 1; q.push(v); } } } } }

浙公网安备 33010602011771号