• 单源最短路的简单应用


    1.dijkstra维护最长路

    下面这个是讨论区的一个佬的理解,非常的nice

    总结一句话,dijkstra的贪心保证了每次选定的点在之后都不会被其他点所更新了

    同理维护最长路的时候我们发现,如果权值是0-1的话,选定的最大值在之后不会变的更大

    所以可以用dijkstra来维护最长路

    1. #include
    2. using namespace std;
    3. const int N = 1e5+10;
    4. double g[2010][2010];
    5. int n,m,s,t;
    6. double dist[N];
    7. bool st[N];
    8. double dijkstra()
    9. {
    10. dist[s] = 1.0;
    11. for(int i=1;i<=n;i++){
    12. int t = -1;
    13. for(int j=1;j<=n;j++)
    14. if(!st[j]&&(t==-1||dist[j]>dist[t]))t = j;
    15. st[t] = 1;
    16. for(int j=1;j<=n;j++)
    17. if(dist[j]
    18. }
    19. return dist[t];
    20. }
    21. int main()
    22. {
    23. cin>>n>>m;
    24. for(int i=1;i<=m;i++){
    25. int a,b,c;cin>>a>>b>>c;
    26. double z = (100.0-c*1.0)/100.0;
    27. g[a][b] = g[b][a] = max(g[a][b],z);
    28. }
    29. cin>>s>>t;
    30. printf("%.8lf",100.0/dijkstra()*1.0);
    31. }

    2.stringstream处理不定长输入

    1. #include
    2. using namespace std;
    3. int n,m;
    4. const int N = 1100;
    5. int g[N][N];
    6. int dist[N];
    7. int a[N];
    8. bool st[N];
    9. void dijkstra()
    10. {
    11. memset(dist,0x3f,sizeof dist);
    12. dist[1] = 0;
    13. for(int i=1;i<=n;i++){
    14. int t = -1;
    15. for(int j=1;j<=n;j++)
    16. if(!st[j]&&(t==-1||dist[j]
    17. st[t] = 1;
    18. for(int j=1;j<=n;j++)
    19. if(dist[j]>dist[t]+g[t][j])dist[j] = dist[t] + g[t][j];
    20. }
    21. }
    22. int main()
    23. {
    24. cin>>m>>n;
    25. memset(g,0x3f,sizeof g);
    26. for(int i=1;i<=n;i++)g[i][i] = 0;
    27. getchar();
    28. for(int i=1;i<=m;i++){
    29. string str;
    30. getline(cin,str);
    31. stringstream ssin(str);
    32. int k = 1;
    33. while(ssin>>a[k])k++;
    34. k--;
    35. for(int s=1;s<=k;s++)
    36. for(int j=1;j
    37. g[a[j]][a[s]] = 1;
    38. }
    39. dijkstra();
    40. if(dist[n]==0x3f3f3f3f)cout<<"NO";
    41. else cout<-1;
    42. }

    3.简单虚拟原点

    注意酋长不一定是这里面等级最高的 所以我们要枚举区间算好几次dijkstra

    1. #include
    2. #include
    3. using namespace std;
    4. const int N = 1010;
    5. int g[N][N];
    6. int dist[N];
    7. bool st[N];
    8. int m,n;
    9. int level[N];
    10. int dijkstra(int l,int r){
    11. memset(dist,0x3f,sizeof dist);
    12. dist[0] = 0;
    13. memset(st,0,sizeof st);
    14. for(int i=1;i<=n;i++){
    15. int t = -1;
    16. for(int j=0;j<=n;j++)
    17. if(!st[j]&&(t==-1||dist[j]
    18. st[t] = 1;
    19. for(int j=1;j<=n;j++)
    20. if(level[j]>=l&&level[j]<=r)
    21. dist[j] = min(dist[j],dist[t]+g[t][j]);
    22. }
    23. return dist[1];
    24. }
    25. int main()
    26. {
    27. cin>>m>>n;
    28. memset(g,0x3f,sizeof g);
    29. for(int i=0;i<=n;i++)g[i][i] = 0;
    30. for(int i=1;i<=n;i++){
    31. int p,l,x;cin>>p>>l>>x;
    32. level[i] = l;
    33. g[0][i] = p;
    34. for(int j=1;j<=x;j++){
    35. int a,b;cin>>a>>b;
    36. g[a][i] = min(g[a][i],b);
    37. }
    38. }
    39. int res = 0x3f3f3f3f;
    40. for(int i=level[1]-m;i<=level[1];++i)
    41. res = min(res,dijkstra(i,i+m));
    42. cout<
    43. }

  • 相关阅读:
    18. SAP ABAP OData 服务嵌套创建功能的实现步骤(Create Deep)
    Vue(三):样式绑定、条件渲染、列表渲染、列表过滤与列表排序
    利用FPGA和CPLD数字逻辑实现模数转换器
    A-level化学知识点(二):一般原则——General Properties
    java计算机毕业设计校园办公管理系统源代码+数据库+系统+lw文档
    MyBatis的各种查询功能(5种)
    [apue] 标准 I/O 库那些事儿
    若依框架使用localStorage代替Cookie?
    【嵌入式基础】内存(Cache,RAM,ROM,Flash)
    Git使用【下】
  • 原文地址:https://blog.csdn.net/m0_60921016/article/details/134329418