[关闭]
@Alpacadh 2022-09-12T14:43:00.000000Z 字数 3392 阅读 702

2019 寒假专题3 J、k、L题解

ACM


J-最短路径问题 (HDU-3790)

题意:

解题思路:

代码:

  1. #include<bits/stdc++.h>
  2. //#include<iostream>
  3. //#include<algorithm>
  4. //#include<cmath>
  5. //#include<cstring>
  6. //#include<stdio.h>
  7. using namespace std;
  8. const int inf=0x3f3f3f3f;
  9. const int N=1e3+5;
  10. const double eps=1e-4;
  11. int g[N][N];
  12. int d[N];
  13. int va[N];
  14. int val[N][N];
  15. int vis[N];
  16. //int pre[N];
  17. void dijkstra(int s, int n)
  18. {
  19. memset(d,inf,sizeof(d));
  20. memset(vis,0,sizeof(vis));
  21. memset(va,inf,sizeof(va));
  22. d[s]=0;
  23. va[s]=0;
  24. // pre[s]=0;
  25. while(1)
  26. {
  27. int v=-1;
  28. for(int u=1;u<=n;u++)
  29. {
  30. if(!vis[u]&&(v==-1||d[u]<d[v]))
  31. v=u;
  32. }
  33. if(v==-1)
  34. break;
  35. vis[v]=1;
  36. for(int u=1;u<=n;u++)
  37. {
  38. if(!vis[u]&&d[u]>d[v]+g[v][u])
  39. {
  40. d[u]=d[v]+g[v][u];
  41. va[u]=va[v]+val[v][u];
  42. // pre[u]=v; // 记录路径
  43. }
  44. else if(!vis[u]&&d[u]==d[v]+g[v][u])
  45. va[u]=min(va[u],va[v]+val[v][u]);
  46. }
  47. }
  48. }
  49. int main()
  50. {
  51. int n,m;
  52. while(scanf("%d%d",&n,&m))
  53. {
  54. if(n==0&&m==0)
  55. break;
  56. memset(g,inf,sizeof(g));
  57. memset(val,inf,sizeof(val));
  58. for(int i=0;i<m;i++)
  59. {
  60. int u,v,a,b;
  61. scanf("%d%d%d%d",&u,&v,&a,&b);
  62. if(g[u][v]>a)
  63. {
  64. g[u][v]=g[v][u]=a;
  65. val[u][v]=val[v][u]=b;
  66. }
  67. else if(g[u][v]==a)
  68. val[u][v]=val[v][u]=min(val[u][v],b);
  69. }
  70. int s,t;
  71. scanf("%d%d",&s,&t);
  72. dijkstra(s,n);
  73. printf("%d %d\n",d[t],va[t]);
  74. }
  75. return 0;
  76. }

K-一个人的旅行 (HDU 2066)

题意:

解题思路:

代码:

  1. #include<bits/stdc++.h>
  2. //#include<iostream>
  3. //#include<algorithm>
  4. //#include<cmath>
  5. //#include<cstring>
  6. //#include<stdio.h>
  7. using namespace std;
  8. const int inf=0x3f3f3f3f;
  9. const int N=1e3+5;
  10. const double eps=1e-4;
  11. int g[N][N];
  12. int d[N];
  13. int vis[N];
  14. //int pre[N];
  15. void dijkstra(int s, int n)
  16. {
  17. memset(d,inf,sizeof(d));
  18. memset(vis,0,sizeof(vis));
  19. d[s]=0;
  20. // pre[s]=0;
  21. while(1)
  22. {
  23. int v=-1;
  24. for(int u=0;u<=n;u++)
  25. {
  26. if(!vis[u]&&(v==-1||d[u]<d[v]))
  27. v=u;
  28. }
  29. if(v==-1)
  30. break;
  31. vis[v]=1;
  32. for(int u=0;u<=n;u++)
  33. {
  34. if(!vis[u]&&d[u]>d[v]+g[v][u])
  35. {
  36. d[u]=d[v]+g[v][u];
  37. // pre[u]=v; // 记录路径
  38. }
  39. }
  40. }
  41. }
  42. int main()
  43. {
  44. int t,n,m;
  45. while(~scanf("%d%d%d",&t,&n,&m))
  46. {
  47. int len=0;
  48. memset(g,inf,sizeof(g));
  49. for(int i=0;i<t;i++)
  50. {
  51. int a,b,c;
  52. scanf("%d%d%d",&a,&b,&c);
  53. len=max(len,max(a,b));
  54. g[a][b]=g[b][a]=min(g[a][b],c);
  55. }
  56. for(int i=0;i<=len;i++)
  57. g[i][i]=0;
  58. for(int i=0;i<n;i++)
  59. {
  60. int a;
  61. scanf("%d",&a);
  62. g[0][a]=g[a][0]=0;
  63. }
  64. dijkstra(0,len);
  65. int ans=inf;
  66. for(int i=0;i<m;i++)
  67. {
  68. int a;
  69. scanf("%d",&a);
  70. ans=min(ans,d[a]);
  71. }
  72. printf("%d\n",ans);
  73. }
  74. return 0;
  75. }

L-HDU Today (HDU-2112)

题意:

解题思路:

代码:

  1. #include<bits/stdc++.h>
  2. //#include<iostream>
  3. //#include<algorithm>
  4. //#include<cmath>
  5. //#include<cstring>
  6. //#include<stdio.h>
  7. using namespace std;
  8. const int inf=0x3f3f3f3f;
  9. const int N=1e2+5;
  10. const double eps=1e-4;
  11. int g[N][N];
  12. int d[N];
  13. int vis[N];
  14. //int pre[N];
  15. void dijkstra(int s, int n)
  16. {
  17. memset(d,inf,sizeof(d));
  18. memset(vis,0,sizeof(vis));
  19. d[s]=0;
  20. // pre[s]=0;
  21. while(1)
  22. {
  23. int v=-1;
  24. for(int u=1;u<=n;u++)
  25. {
  26. if(!vis[u]&&(v==-1||d[u]<d[v]))
  27. v=u;
  28. }
  29. if(v==-1)
  30. break;
  31. vis[v]=1;
  32. for(int u=1;u<=n;u++)
  33. {
  34. if(!vis[u]&&d[u]>d[v]+g[v][u])
  35. {
  36. d[u]=d[v]+g[v][u];
  37. // pre[u]=v; // 记录路径
  38. }
  39. }
  40. }
  41. }
  42. map<string,int>q;
  43. int main()
  44. {
  45. int t;
  46. while(~scanf("%d",&t))
  47. {
  48. if(t==-1)
  49. break;
  50. q.clear();
  51. memset(g,inf,sizeof(g));
  52. int k=0;
  53. string s,tt;
  54. cin>>s>>tt;
  55. q[s]=++k;
  56. if(s!=tt)
  57. q[tt]=++k;
  58. for(int i=0;i<t;i++)
  59. {
  60. string a,b;
  61. int time;
  62. cin>>a>>b;
  63. if(q[a]==0)
  64. q[a]=++k;
  65. if(q[b]==0)
  66. q[b]=++k;
  67. scanf("%d",&time);
  68. g[q[a]][q[b]]=g[q[b]][q[a]]=time;
  69. }
  70. dijkstra(1,k);
  71. printf("%d\n",d[q[tt]]==inf?-1:d[q[tt]]);
  72. }
  73. return 0;
  74. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注