/*不同于最小生成树是对边排序,最短路径是对点到起点的距离排序memset可以初始化整个结构体,但只能初始化为0或-1,结构体内指针会变为NULL#includefill(arr,arr+n,要赋的值)fill不能初始化整个结构体,但可以任意赋值除数组外,vector也可以用这种方法赋值:fill(v.begin(),v.end(),要赋的值)#include先存这个vector graph[1000];//1~999//所有点的相邻点及其距离???再初始化这个int dis[200];//0~199//点到起点的距离最后BFS*/#include #include #include #include#include using namespace std;const int INF=INT_MAX;struct Point{ int id;//0~200 int distance; bool operator { 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 graph[1000];//1~999//所有点的相邻点及其距离???int dis[200];//0~199//每个点到起点的距离//BFSvoid Dijkstra(int s)//源点s{ priority_queue q; dis[s]=0; q.push(Point(s,dis[s]));//源点入队 while(!q.empty()) { int u=q.top().id;//距离最小的边的点的id q.pop(); for(int i=0;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 { 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 }}