南京装修公司做网站为中小型企业构建网站
news/
2025/9/23 0:53:27/
文章来源:
南京装修公司做网站,为中小型企业构建网站,广西城乡建设厅网站,徐州市网站Marica对Mirko很生气#xff0c;因为他找到了一个新的女朋友#xff0c;她想报仇。由于她不住在同一个城市#xff0c;她开始为长途旅行做准备。我们知道每条路从一个城市到另一个城市需要多少分钟。
米尔科在车里无意中听到其中一条路正在维修#xff0c;路被堵住了…Marica对Mirko很生气因为他找到了一个新的女朋友她想报仇。由于她不住在同一个城市她开始为长途旅行做准备。我们知道每条路从一个城市到另一个城市需要多少分钟。
米尔科在车里无意中听到其中一条路正在维修路被堵住了但不知道具体是哪条路。无论哪条路是封闭的从马里卡的城市到米尔科的都是可能的。
玛丽卡只走不堵塞的路而且走最短的路。米尔科想知道她在最坏的情况下要多久才能到达他的城市这样他就能确保他的女朋友离开这个城市足够长时间。编写一个程序帮助Mirko找出Marica从没有堵塞的道路到他所在城市的最短路线所需要的几分钟内最长的时间。
输入
每一种情况都有两个数字在第一行N和M由一个单独的空间城镇的数量和城镇之间的道路的数量分开。1≤N≤1000,1≤≤N *(N - 1)/ 2。这些城市的编号从1到N, Mirko位于城市1,Marica位于城市N。
接下来的M行是三个数字A、B和V用逗号隔开。1≤B≤N 1 V≤≤1000。这些数字意味着a和B城市之间有一条双向道路而且在V分钟内是可以交叉的。
输出
在输出文件的第一行中以分钟为单位写入最大时间Marica可能需要花几分钟才能到达Mirko。
样例输入
5 6
1 2 4
1 3 3
1 2 3
2 4 4
2 5 7
4 5 1
6 7 1 2 1
2 3 4
3 4 4
4 6 4
1 5 5
2 5 2
5 6 5
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
样例输出
11
13
27
题意 最短指时间最短坏一条边此时的最短路的时间比其他坏一条边之后的最短路的时间长输出这个时间
分析与解答
如果拆掉的边不在最初的最短路上那么最短路的长度是不会变化的。 那么就只拆最短路上的边。 上句话参考http://blog.sina.com.cn/s/blog_8d84b9240101f827.html 这样我们拆的范围就减小了怎么算得上拆就是让两个路的距离变成inf即可。由于拆的是最短路上的边所以我们还要记录最短路的路径。拆完之后我们再调用dijkstra此时我们不用再记录最短路的路径而且调用完我们还得恢复拆的路以便下一次拆其他不同的路。
我们看看怎么记录路径
for(j1;jm;j)
if(!vis[j]dis[k]map[k][j]dis[j]){dis[j]dis[k]map[k][j];p[j]k;//p数组记录路径 即j点前驱}
我们找到了起点到终点k的最短路dis[k]现在以k为起点更新以其他点为终点的最短路dis[j]虽然有可能dis[j]再接下来的循环中会更短但是没事我们的路径的记录同样也会变的所以我就可以在每次循环中就认定最短路中j的前驱就是k
代码参考 https://blog.csdn.net/z8110/article/details/50061289
#includestdio.h
#includestring.h
#includealgorithm
#define N 0x3f3f3f3f
using namespace std;
int map[1100][1100],dis[1100],vis[1100],i,j,k,l,m,n,x,y,z,p[1100];
void dj(int v)//迪杰斯特拉算法
{int i,j,k;memset(vis,0,sizeof(vis));memset(dis,N,sizeof(dis));dis[1]0;//标记开始点已经被使用 for(i1;im;i){int MinN;for(j1;jm;j){if(!vis[j]dis[j]Min){Mindis[j];kj;}}if(MinN)//优化如果没有找到较小的直接结束 return ;vis[k]1;for(j1;jm;j)if(!vis[j]dis[k]map[k][j]dis[j]){dis[j]dis[k]map[k][j];if(v)p[j]k;//p数组记录路径 即j点前驱} }
}
int main()
{while(scanf(%d%d,m,n)!EOF){memset(p,0,sizeof(p));memset(map,N,sizeof(map));
// for(i1;im;i)
// map[i][i]0;for(i0;in;i){scanf(%d%d%d,x,y,z);if(map[x][y]z)map[x][y]map[y][x]z;}//int ansdj(1);//printf(%d\n,ans);dj(1);//以1为起点 int Maxdis[m];for(im;i!1;ip[i])//从m开始是因为p[j]k是k连的j一直到m {zmap[i][p[i]];//把当前点和路径上的当前点的下一个点断开 map[i][p[i]]map[p[i]][i]N;dj(0);// 删边之后路径会改变只记录未删时候的路径Maxmax(Max,dis[m]); map[i][p[i]]map[p[i]][i]z;//再连上 }printf(%d\n,Max);}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910926.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!