标签:names 输入 思想 输出 邻接表 clu cst i++ string
Dijktra算法:
思想:找到距离原点最近的一个顶点,然后以该点为中心进行扩展,最终得到源点到其余各点的最短路径。
缺点:无法解决带负边的图论问题。
输入样例:
6 9 1 (6个点 9条边 起点为1)
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
输出样例:
0 1 8 4 13 17 (源点到各点的最短距离)
#include <cstdio> #include <string.h> #include <iostream> #include <algorithm> #include <sstream> #include <math.h> #include <vector> using namespace std; const int inf=999999;//0x7fffff const long long mod=1e9+7; const double PI=acos(-1); int n,m; int ans=9999999; bool vis[105]; int dis[105]; struct node{ int u; int w; node(int uu,int ww){ u=uu; w=ww; } }; vector<node> v[105]; void Dijkstra(int s){ //Dijkstra算法为单源最短路径算法 s 为起点 memset(dis,inf,sizeof(dis)); //dis数组表示起点 s 到每个点的最小路径 vis[s]=1; dis[s]=0; for(int i=0;i<v[s].size();i++){ //初始dis最短路径表 node no = v[s][i]; dis[no.u]=no.w; } int min,minp; for(int i=1;i<=n;i++){ //遍历dis数组的每一个最短路径 min=inf; for(int j=1;j<=n;j++){ if(!vis[j]&&dis[j]<min){ //寻找并记录此时dis表的最短路径的值和距离 min=dis[j]; minp=j; } } vis[minp]=1; for(int u=0;u<v[minp].size();u++){ //寻找此时最短路径的点可到的点 并更新该点的最短路径 node no=v[minp][u]; if(!vis[no.u]&&dis[no.u]>dis[minp]+no.w){ dis[no.u]=dis[minp]+no.w; } } } } int main() { int x,y,value,s; cin>>n>>m>>s; for(int i=1;i<=n;i++){ dis[i]=inf; } for(int i=0;i<m;i++){ cin>>x>>y>>value; v[x].push_back(node(y,value)); } Dijkstra(s); //s 为起点 for(int i=1;i<=n;i++){ //输出s 到各个点的最短路径 cout<<dis[i]<<" "; } return 0; }
标签:names 输入 思想 输出 邻接表 clu cst i++ string
原文地址:https://www.cnblogs.com/xusi/p/12598826.html