首页 > 代码库 > 最短路模板[spfa][dijkstra+堆优化][floyd]
最短路模板[spfa][dijkstra+堆优化][floyd]
借bzoj1624练了一下模板(虽然正解只是floyd)
spfa:
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <vector>#include <queue>using namespace std;const int INF=100001;const int maxm=10001,maxn=101;int n,m,x,y,w;long long ans=0;int a[maxm];int dist[maxn];bool vis[maxn];struct edge{ int to,w; edge(int _to,int _w){to=_to;w=_w;}};vector <edge> g[maxm];void spfa(int x){ queue<int> q; memset(dist,63,sizeof(dist)); memset(vis,false,sizeof(vis)); dist[x]=0; vis[x]=1; q.push(x); while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; int l=g[u].size(); for(int i=0;i<l;i++){ int v=g[u][i].to; if(dist[v]>dist[u]+g[u][i].w){ dist[v]=dist[u]+g[u][i].w; if(!vis[v]){ vis[v]=1;q.push(v); } } } }}int main(){ freopen("data.in","r",stdin); freopen("text.out","w",stdout); //freopen("data.txt","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ scanf("%d",&w); if(i!=j) g[i].push_back(edge(j,w)); } for(int i=1;i<m;i++){ spfa(a[i]); ans+=dist[a[i+1]]; } cout<<ans; return 0;}
dijkstra+priority_queue:
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <vector>#include <queue>using namespace std;const int INF=100001;const int maxm=10001,maxn=101;int n,m,x,y,w;long long ans=0;int a[maxm];int dist[maxn];struct edge{ int to,w; edge(int _to,int _w){to=_to;w=_w;}};vector <edge> g[maxm];typedef pair<int,int> P;void dijkstra(int x){ priority_queue< P , vector <P> , greater<P> > q; memset(dist,63,sizeof(dist)); dist[x]=0; q.push(P(0,x)); while(!q.empty()){ P u=q.top(); int x=u.second; q.pop(); if(dist[x]<u.first) continue; int l=g[x].size(); for(int i=0;i<l;i++){ int v=g[x][i].to; if(dist[v]>dist[x]+g[x][i].w){ dist[v]=dist[x]+g[x][i].w; q.push(P(dist[v],v)); } } }}int main(){ freopen("danger.in","r",stdin); freopen("danger.out","w",stdout); //freopen("data.txt","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ scanf("%d",&w); if(i!=j) g[i].push_back(edge(j,w)); } for(int i=1;i<m;i++){ dijkstra(a[i]); ans+=dist[a[i+1]]; } cout<<ans; return 0;}
floyd:
#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<string>#include<queue>#include<stack>#include<vector>using namespace std;int n,m,i,j,k,ans,f[102][102],a[10002];int main(){ cin>>n>>m; for(i=1;i<=m;i++)scanf("%d",&a[i]); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&f[i][j]); for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) f[i][j]=min(f[i][j],f[i][k]+f[k][j]); for(i=2;i<=m;i++)ans+=f[a[i-1]][a[i]]; cout<<ans; return 0;}
最短路模板[spfa][dijkstra+堆优化][floyd]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。