邻接链表+优先队列.Dijkstra
#include<cstdio> #include<cstring> #include<queue> #define inf 0x3f3f3f3f using namespace std; typedef pair<int,int> pii; priority_queue<pii,vector<pii>,greater<pii> >q; struct edge{ int x,z,next; }e[300005]; int n,m,f[30005],vis[30005],tot=1,head[30005]; void adde(int u,int x,int z)//建树 { e[tot].x=x; e[tot].z=z; e[tot].next=head[u]; head[u]=tot++; } int main() { int a,b,c; memset(head,-1,sizeof(head)); memset(f,inf,sizeof(f)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); adde(a,b,c); adde(b,a,c); } f[1]=0; q.push(make_pair(f[1],1)); while(!q.empty()) { int u=q.top().second; q.pop(); if(vis[u]) continue; vis[u]=1; for(int k=head[u];k!=-1;k=e[k].next) { int t=e[k].x; if(f[u]+e[k].z<f[t]) { f[t]=f[u]+e[k].z; q.push(make_pair(f[t],t)); } } } printf("%d",f[n]); return 0; }
SPFA
#include<cstdio> #include<cstring> #include<queue> #define inf 0x3f3f3f3f #define maxm 30001 using namespace std; queue<int> q; struct edge{ int x,z,next; }e[150001]; int n,m,f[maxm],vis[maxm],tot=1,head[maxm]; void adde(int u,int x,int z) { e[tot].x=x; e[tot].z=z; e[tot].next=head[u]; head[u]=tot++; e[tot].x=u; e[tot].z=z; e[tot].next=head[x]; head[x]=tot++; } int main() { int a,b,c,p; memset(head,-1,sizeof(head)); memset(f,inf,sizeof(f)); memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); adde(a,b,c); } f[1]=0; q.push(1); vis[1]=1; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int k=head[u];k!=-1;k=e[k].next) { p=e[k].x; if(f[p]>f[u]+e[k].z) { f[p]=f[u]+e[k].z; if(!vis[p]) { q.push(p); vis[p]=1; } } } } printf("%d",f[n]); return 0; }