最短路 Dijkstra
来源:互联网 发布:js正则匹配多个字符串 编辑:程序博客网 时间:2024/06/05 22:56
Dijkstra 单源最短路 邻接矩阵形式
/**单源最短路径,Dijkstra算法,邻接矩阵形式,复杂度为o(n^2)*求出源beg到所有点的最短路径,传入图的顶点数和邻接矩阵cost[][]*返回各点的最短路径lowcost[],路径pre[],pre[i]记录beg到i路径上的父节点,pre[beg]=-1;*可更改路径权类型,但是权值必须为非负,下表0~n-1*/‘const int MAXN=1010;const int INF=0x3f3f3f3f;bool vis[MAXN];int pre[MAXN];void Dijkstra(int cost[][MAXN],int lowcost[],int n,int beg){ for(int i=0;i<n;i++) { lowcost[i]=INF; vis[i]=false; pre[i]=-1; } lowcost[beg]=0; for(int j=0;j<n;j++) { int k=-1; int min=INF; for(int i=0;i<n;i++) { if(!vis[i]&&lowcost[i]<min) { min=lowcost[i]; k=i; } } if(k==-1) { break; } vis[k]=true; for(int i=0;i<n;i++) { if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]) { lowcost[i]=lowcost[k]+cost[k][i]; pre[i]=k; } } }}Dijkstra单源最短路 邻接矩阵形式 双路径信息
/**单源最短路径,dijkstra算法,邻接矩阵形式,复杂度为o(n^2)*两点间距离存入map[][],两点间花费存入cost[][]*求出源st到所有点的最短路径及其对应最小花费*返回各点的最短路径lowdis[]以及对应的最小花费lowval[]*可更改路径权类型,但是权值必须为非负,下标1~n*/const int MAXN=1010;const int INF=0x3f3f3f3f;int n,m;int lowdis[MAXN];int lowval[MAXN];int visit[MAXN];int map[MAXN][MAXN];int cost[MAXN][MAXN];void dijkstra(int st){ int temp=0; for(int i=1;i<=n;i++) { lowdis[i]=map[st][i]; lowval[i]=cost[st][i]; } memset(visit,0,sizeof(visit)); visit[st]=1; for(int i=1;i<n;i++) { int MIN=INF; for(int j=1;j<=n;j++) { if(!visit[j]&&lowdis[j]<MIN) { temp=j; MIN=lowdis[j]; } } visit[temp]=1; for(int j=1;j<=n;j++) { if(!visit[j]&&map[temp][j]<INF) { if(lowdis[j]>lowdis[temp]+map[temp][j]) { lowdis[j]=lowdis[temp]+map[temp][j]; lowval[j]=lowval[temp]+cost[temp][j]; } else if(lowdis[j]==lowdis[temp]+map[temp[j]) { if(lowval[j]>lowval[temp]+cost[temp][j]) { lowval[j]=lowval[temp]+cost[temp][j]; } } } } } return; }
Dijkstra起点Start结点有权值
#define M 505const int inf=0x3f3f3f3f;int num[M]; //结点权值int map[M][M]; //图的临近矩阵int vis[M]; //结点是否处理过int ans[M]; //最短路径结点权值和int dis[M]; //各点最短路径花费int n,m,Start,End; //n结点数,m边数,Start起点,End 终点void Dij(int v){ ans[v]=num[v]; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { if(map[v][i]<inf) { ans[i]=ans[v]+num[i]; } dis[i]=map[v][i]; } dis[v]=0; vis[v]=1; for(int i=1;i<n;i++) { int u=0,min=inf; for(int j=0;j<n;j++) { if(!vis[j]&&dis[j]<min) { min=dis[j]; u=j; } } vis[u]=1; for(int k=0;k<n;k++) { if(!vis[k]&&dis[k]>map[u][k]+dis[u]) { dis[k]=map[u][k]+dis[u]; ans[k]=ans[u]+num[k]; } } for(int k=0;k<n;k++) { if(dis[k]==map[u][k]+dis[u]) { ans[k]=max(ans[k],ans[u]+num[k]); } } } printf("%d %d\n",dis[End],ans[End]);//输出终点最短路径花费、最短路径结点权值和}int main(){ scanf("%d%d%d%d",&n,&m,&Strat,&End); for(int i=0;i<n;i++) scanf("%d",&num[i]); memset(vis,0,sizeof(vis)); memset(map,0x3f,sizeof(map)); for(int i=0;i<m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); if(map[x][y]>z) { map[x][y]=z; map[y][x]=z; } } Dij(Start); return 0;}
1 0
- 最短路 Dijkstra算法
- 最短路之dijkstra
- hdu1874 Dijkstra 最短路
- HUD最短路 (Dijkstra)
- hdu2544 Dijkstra最短路
- 最短路之Dijkstra
- 图论 最短路 Dijkstra
- Dijkstra 求最短路
- dijkstra最短路 hdu2066
- Dijkstra 求最短路
- 最短路dijkstra--poj2502
- HDU2544:最短路(Dijkstra)
- 最短路 dijkstra模板
- 最短路(dijkstra)
- 最短路算法Dijkstra
- Dijkstra最短路算法
- 最短路-dijkstra
- 最短路(dijkstra)
- SpringCloud关于@FeignClient和Hystrix集成对http线程池监控问题
- EOS中怎样编写执行多条sql的运算逻辑
- 金典——判断直线相交
- Java 访问修饰符
- R, Groovy
- 最短路 Dijkstra
- 三个水杯(bfs)
- springmvc拦截器配置
- android 腾讯x5内核 浏览器
- 画圆
- 密码不回显函数(一)
- 编译和使用APUE的源码
- HDU 2059 龟兔赛跑 (简单dp)
- 鼠标控制相机旋转缩放,带一点阻尼的脚本