/* 不同于最小生成树是对边排序,最短路径是对点到起点的距离排序memset可以初始化整个结构体,但只能初始化为0或-1,结构体内指针会变为NULL#include<ctring>fill(arr,arr+n,要赋的值)fill不能初始化整个结构体,但可以任意赋值除数组外,vector也可以用这种方法赋值:fill(v.begin(),v.end(),要赋的值)#include<algorithm>先存这个vector<Edge> graph[1000];//1~999//所有点的相邻点及其距离???再初始化这个int dis[200];//0~199//点到起点的距离最后BFS*/#include <iostream>#include <queue>#include <climits>#include<algorithm>#include <cstring>using namespace std;const int INF=INT_MAX;struct Point{int id;//0~200int distance;bool operator<(const Point&amp; p)const{return distance>p.distance;}Point (int i,int d){id=i;d=distance;}};struct Edge{//double from;int to;//双向边分成了两条int length;Edge(int t,int l){to=t;length=l;}};vector<Edge> graph[1000];//1~999//所有点的相邻点及其距离???int dis[200];//0~199//每个点到起点的距离//BFSvoid Dijkstra(int s)//源点s{priority_queue<Point> q;dis[s]=0;q.push(Point(s,dis[s]));//源点入队while(!q.empty()){int u=q.top().id;//距离最小的边的点的idq.pop();for(int i=0;i<graph[u].size();i++)//对当前点的所有相连点进行距离更新{int v=graph[u][i].to;//相连点的编号int d=graph[u][i].length;//相连点的距离if(dis[v]>dis[u]+d){dis[v]=dis[u]+d;q.push(Point(v,dis[v]));}}}}int main() {int n,m;//点数量,边数量while (cin >>n>>m) {fill(dis,dis+n,INF);memset(graph,0,sizeof(graph));//不能用fill(graph,graph+1000,0);因为fill不能初始化结构体for(int i=1;i<=m;i++){int from,to,length;cin>>from>>to>>length;graph[from].push_back(Edge(to,length));graph[to].push_back(Edge(from,length));}int s,t;//起点,终点cin>>s>>t;Dijkstra(s);if(dis[t]==INF)dis[t]=-1;cout<<dis[t]<<endl;}}