当前位置: > 财经>正文

Dijkstra算法(二)

2023-07-19 08:14:05 互联网 未知 财经
描述:

给出n 个城市,M条无向边。每个城市中都有一定数目的救援小组,所有边的边权已知。现在给出起点和终点,求从起点到终点的最短路径条数以及最短路径上的救援小组数目之和。如果有多条最短路径,则输出数目之和最大的。

样例:

输入:第一行4个数,为n,m,起点,终点 第二行为 每个顶点的救援小组数目 之后的m行为顶点到顶点之间的边权

5 6 0 21 2 1 5 30 1 10 2 20 3 11 2 12 4 13 4 1

输入:两个数,为最短路径条数以及最短路径上救援小组数目之和。

2 4

代码:

#includeusing namespace std;;const int INF = 0x3f3f3f3f;int n,m,e[200][200],vis[200],p[200],g[200],start,end,d[200],w[200];//顶点数,边数,邻接矩阵,是否访问,路径数目 ,救援小组数目 ,起点,终点 ,最短路 ,最大救援 void Dijkstra(int &start){d[start] = 0;w[start] = g[start];p[start] = 1;//初始化最短路,最大救援,和路径数目 int min,u = -1;for(int i = 0;iif(vis[j] == 0 && d[j] if(vis[v] == 0 && e[u][v] //如果可以松弛 d[v] = e[u][v] + d[u];//更新最短路径 w[v] = w[u] + g[v];//更新救援小组数目 p[v] = p[u]; //更换路径数目 }else if(e[u][v] + d[u] == d[v]){//如果相等 if(w[u] + g[v] > w[v]){//如果救援小组数目较多 w[v] = g[v] + w[u];// 更新 }p[v] += p[u];//路径数更新,写在外面 }}} }} int main(){freopen("a.txt","r",stdin);memset(e,INF,sizeof e);memset(p,0,sizeof p);memset(vis,0,sizeof vis);memset(d,INF,sizeof d);memset(w,0,sizeof w);cin>>n>>m>>start>>end;for(int i = 0;ifor(int j = 0;j

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。