首页 > 代码库 > 最短路模板
最短路模板
//dijkstra算法求单源点最短路:类似求最小生成树的prim算法。要求边权值非负。 #include<iostream> #include<cstring> using namespace std; const int MAX=10000007; int mp[1005][1005],dis[1005],vis[1005]; int n,m; void dijk(int s)//求s到每个点的最短路 { for(int i=1;i<=n;i++) //初始化s到每个点的距离 { dis[i]=mp[s][i]; vis[i]=0; } vis[s]=1; for(int i=1;i<=n;i++)//n次循环 { int Min=MAX,sta=0; //sta初始化一下,防止下面找不到j,而出现vis[sta]数组越界。 for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<Min) { Min=dis[j]; sta=j; } } vis[sta]=1; for(int j=1;j<=n;j++)//松弛 { if(!vis[j]&&mp[sta][j]!=MAX&&dis[j]>dis[sta]+mp[sta][j]) dis[j]=dis[sta]+mp[sta][j]; } } } int main() { return 0; } ************************************************************************** //floyd算法求每两个点之间的最短路。三重循环。要求边权值非负 for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(mp[i][j]>mp[i][k]+mp[k][j]){ mp[i][j]=mp[i][k]+mp[k][j]; } } } } *************************************************************************** //spfa算法适用于边权值为正和负的两种情况。邻接表写的。 /* 1.队列Q={s} 2.取出队头u,枚举所有的u的临边 .若d(v)>d(u)+w(u,v)则改进 ,pre(v)=u,由于d(v) 减少了,v可能在以后改进其他的点,所以若v不在Q中,则将v入队。 3.一直迭代2,直到队列Q为空(正常结束),或有的点的入队次数>=n(含有负圈)(加一个cnt数组 记录每个点的入队次数)。 */ #include<iostream> #include<cstring> #include<queue> #include<vector> using namespace std; const int inf=9999999; int vis[10004],dis[10004],n; struct node{ int from,to,value; }; vector<node>g[10004]; void spfa(int s) { for(int i=0;i<=n;i++) dis[i]=inf; memset(vis,0,sizeof(vis)); vis[s]=1; dis[s]=0; queue<int>q; q.push(s); while(!q.empty()){ int cur=q.front(); q.pop(); for(int i=0;i<(int)g[cur].size();i++){ int k=g[cur][i].to; if(dis[i]>dis[cur]+g[cur][i].value){ dis[i]=dis[cur]+g[cur][i].value; if(!vis[k]){ vis[k]=1; q.push(k); } } } vis[cur]=0; } } int main() { return 0; }
最短路模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。