求单源最短路问题
#include<iostream>
#include<cstring>
using namespace std;
const int N=1001;
const int M=10001;
struct edge{//v表示这条边连接顶点编号//w边权 。next下一条边的顶点编号 int v,w,next;edge(){}edge(int _v,int _w,int _next){v=_v;w=_w;next=_next;}
}e[M*2]; //这个e数组里就是每一条边
int head[N],size;
void init(){memset(head,-1,sizeof(head));size=0; //当前图中一共有多少条边
}
void insert(int u,int v,int w){e[size]=edge(v,w,head[u]);head[u]=size;size++;
}
void insert2(int u,int v,int w){insert(u,v,w);insert(v,u,w);
}
int n,m;
int dis[N]; //dis数组表示源点到某个点的最短路径
bool vis[N]; //表示这个点有没有被标记过
void dijkstra(int u){memset(vis,false,sizeof(vis));memset(dis,0x3f,sizeof(dis)); //memset是逐字符赋值的 dis[u]=0;for(int i=0;i<n;i++){// mind两点距离初始是正无穷,minj表示点的编号,初始是-1 int mind=1000000000,minj=-1; for(int j=1;j<=n;j++){ //表示顶点编号从1开始 if(!vis[j]&&dis[j]<mind){minj=j;mind=dis[j];}}if(minj==-1){ //不是连通图,直接结束循环 return;}vis[minj]=true;for(int j=head[minj];~j;j=e[j].next){ //~j表示j!=-1 int v=e[j].v;int w=e[j].w;if(!vis[v]&&dis[v]>dis[minj]+w){dis[v]=dis[minj]+w;}}}
}
int main(){init();//初始化邻接表 int u,v,w;//n表示源点第n个顶点的最短路径//m表示m条无向边 cin>>n>>m; while(m--){cin>>u>>v>>w;insert2(u,v,w); //插入无向边 }dijkstra(1); //从第一个顶点开始 cout<<dis[n]<<endl;return 0;
}
//3 3
//1 2 5
//2 3 5
//3 1 2
//2