poj3268 Silver Cow Party(最短路)

素颜马尾好姑娘i 2021-10-29 16:22 292阅读 0赞

非常感谢kuangbin专题啊,这道题一开始模拟邻接表做的,反向边不好处理,邻接矩阵的话舒服多了。

题意:给n头牛和m条有向边,每头牛1~n编号,求所有牛中到x编号去的最短路+回来的最短路的最大值。

1682883-20190527185439037-1445749065.png

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <queue>
  6. using namespace std;
  7. const int maxn = 1e3 + 5;
  8. const int maxm = 1e5 + 5;
  9. const int inf = 0x3f3f3f3f;
  10. struct edge{
  11. int s, to, w, next;
  12. } ed[maxm];
  13. int n, m, x;
  14. int mp[maxn][maxn], dis1[maxn], dis2[maxn];
  15. bool vis[maxn];
  16. inline int max( int a, int b ){
  17. return a>b ? a:b;
  18. }
  19. inline int min( int a, int b ){
  20. return a<b ? a:b;
  21. }
  22. inline int dij(){
  23. //先求了去到x的最短路
  24. memset( vis, 0, sizeof(vis) );
  25. memset( dis1, inf, sizeof(dis1) );
  26. dis1[x] = 0;
  27. for( int i=1; i<n; i++ ){
  28. int minid, MIN=inf;
  29. for( int j=1; j<=n ;j++ ) if( !vis[j] && MIN>dis1[j] ) MIN = dis1[minid=j];
  30. vis[minid] = 1;
  31. for( int j=1; j<=n; j++ ) if( !vis[j] ) dis1[j] = min(dis1[j], dis1[minid]+mp[minid][j]);
  32. }
  33. //接下来求回去的最短路
  34. memset( vis, 0, sizeof(vis) );
  35. memset( dis2, inf, sizeof(dis2) );
  36. dis2[x] = 0;
  37. for( int i=1; i<n; i++ ){
  38. int minid, MIN = inf;
  39. for( int j=1; j<=n; j++ ) if( !vis[j] && MIN>dis2[j] ) MIN = dis2[minid=j];
  40. vis[minid] = 1;
  41. for( int j=1; j<=n; j++ ) if( !vis[j] ) dis2[j] = min( dis2[j], dis2[minid]+mp[j][minid] );
  42. }
  43. //遍历求出res
  44. int res = -inf;
  45. for( int i=1; i<=n; i++ ) res = max( dis1[i]+dis2[i], res );
  46. return res;
  47. }
  48. int main(){
  49. // freopen("in.txt", "r", stdin);
  50. ios::sync_with_stdio(0); //加速cin 和 cout读取速度,但是这样的话就不能使用scanf了
  51. cin.tie(0);
  52. cout.tie(0);
  53. cin >> n >> m >> x;
  54. memset( mp, inf, sizeof(mp) );
  55. for( int i=1; i<=n; i++ ) mp[i][i] = 0;
  56. for( int i=0; i<m; i++ ){
  57. int u, v, w;
  58. cin >> u >> v >> w;
  59. mp[u][v] = w;
  60. }
  61. cout << dij() << endl;
  62. return 0;
  63. }

转载于:https://www.cnblogs.com/WAautomaton/p/10932409.html

发表评论

表情:
评论列表 (有 0 条评论,292人围观)

还没有评论,来说两句吧...

相关阅读