问题描述:
解题分析:
按照Digkra最短路径算法,会运行超时,如果对其优化还可以,但思路应该没错
采用Floyd算法来解决该问题
不知道为什么?scanf没通过,而cout通过了
Floyd算法模板:
#include <bits/stdc++.h>
using namespace std;
int dp[6][6];
int main(){
int n,m;
cin>>n>>m;
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=m;++i){
int a,b,c;
cin>>a>>b>>c;
dp[a][b] = dp[b][a] = min(dp[a][b],c);
}
for(int i=1;i<=n;++i) dp[i][i]=0;
//开始处理
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]);
//输出
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
AC代码:
直接上代码试试:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long INF = 0x3f3f3f3f3f3f3f3fLL;
const int maxxxxx = 405;
ll floy[maxxxxx][maxxxxx];
int n,m,q;
void FFF(){
//Floyd算法
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
floy[i][j] = min(floy[i][j],floy[i][k]+floy[k][j]);
}
int main(){
//输入数据
cin>>n>>m>>q;
memset(floy,0x3f,sizeof(floy));
for(int i=1;i<=n;++i) floy[i][i] = 0; //处理自身
int a,b;ll c;
for(int i=1;i<=m;++i){
cin>>a>>b>>c; floy[a][b] = floy[b][a] = min(floy[a][b],c);
}
//处理数据
FFF();
//输出结果
int st,ed;
for(int m=1;m<=q;++m){
scanf("%d %d",&st,&ed);
if(floy[st][ed]==INF) cout<<-1<<endl;;
else cout<<floy[st][ed]<<endl;
}
return 0;
}