2621 解题思路

Papyrus在审判你  •  8个月前


可以看到,题目上说的是解题思路,
所以想看答案的童鞋们就别想了~
首先,众所周知,图的最短路径有两种算法可以求出来:
“DJ特斯拉”和“弗洛1德”(Doge),
而相比于先者,“弗洛1德”算法显然要简单的多,
所以,
只要你做了那道弗洛1德的6级题目
(没做的主播也贴心地发了题解哦)
这道题也将会简单的很多。
首先,将那道题的代码复制过来,
然后只需要小小滴改动几个地方,
把下面输出的地方改掉,
因为我们是要求至少要用几天,
那就应该输出最长路径所用的时间(最大时间值),
那么我们就可以在弗洛伊德算法结束后,
判断一点到其他各点的距离中,那个是最长的,将最长的权值输出即可。
(提醒:max函数特别好用)~
而我们如果发现有点没有和1点相连,
就可以直接cout“-1”然后return 0,
(为了实现,可以在一开始的时候给数组全部赋值为大值或负数)
接着就是记得在读入的时候改成无向连通图。
最后一个温馨提示,
最好把算法内的min函数改为if形式,
我刚开始用min写的结果给我报Runtime Error,
真是无语死了,总之别问为什么……
好了,思路点拨就到这了,
我真是一个良心的UP主啊,下题见啦!
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
呃,
好吧,
被你识破了,
其实,
为了防止你们
像某脏那样上课没听
结果罚抄10遍,
我
还是
把
代码
给
你
们
吧
吧
。
#include<bits/stdc++.h>
using namespace std;
int a[110][110];
const int big=10000111;
int main()
{
    int n,m,x,y,z;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            a[i][j]=big;
        }
    }
    for(int i=0;i<m;i++){      
        cin>>x>>y>>z;
        a[x][y]=z;
        a[y][x]=z;
   }
   for(int k=1;k<=n;k++){        
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(a[i][k]+a[k][j]<a[i][j]){                 
                        a[i][j]=a[i][k]+a[k][j];
                }
            }
        }
   }
   int s=0;
   for(int i=2;i<=n;i++){       
       s=max(s,a[1][i]);
       if(a[1][i]==big){
           cout<<"-1";
           return 0;
       }
   }
   cout<<s;
   return 0;
}
慢走不送~

评论:

良心主播


Papyrus在审判你  •  8个月前

请先登录,才能进行评论