标签:void tar make 循环 while class pop flag empty
1.图的初始条件[数组表示]
//邻接表存储 int node[N]; struct Edge{ int to,next,value; }edges[M]; int flag; //矩阵存储 int dis[N][N];
已知起点和终点的最短路
dijkstra 算法:选择最短边上的点直到所有点加入。【复杂度为NlogN+M ? 】
int dis[N],vis[N]; priority_queue<int> q; //example:最短路径 int dis[N],vis[N]; priority_queue<pair<int,int>> q; void dijsktra(int a){ memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[a]=0; q.push(make_pair(0,a)); while (!q.empty()){ int nn=q.top().second; q.pop(); if (vis[nn]) continue; vis[nn]=1; for (int e=node[nn];e;e=edges[e].next){ int ns=edges[e].to,value=dis[nn]+edges[e].value; if (value<dis[ns]){ dis[ns]=value; q.push(make_pair(-dis[ns],ns)); } } } }
sfpa算法【适用于负权值边,最大复杂度为NM】【基于Bellman-Ford算法】
【bfs+队列】【出队遍历子点,子点满足条件则加入队列,循环直到队列为空,达到极值】
int dis[N],vis[N]; queue<int> q; void sfpa(int start){ memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); //init dis[start]=0; vis[start]=1; q.push(start); while(!q.empty()){ int cn=q.front(); q.pop(); vis[cn]=0; for(int e=node[cn];e;e=edges[e].next){ int sn=edges[e].to,value=edges[e].value; if(dis[sn]>dis[cn]+value){ dis[sn]=dis[cn]+value; if(!vis[sn])q.push(sn),vis[sn]=1; } } } }
Floyd算法【用dis[N][N]存储最短距离,依次寻找路径点数为k的最短路径,遍历n次,即为最短距离】【是否有环路】
void floyd(int n){ for(int k=1;k<=n;k++)//k指的是路径中包含前k个点 for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); }
标签:void tar make 循环 while class pop flag empty
原文地址:https://www.cnblogs.com/nianyi/p/13363975.html