这是我学习Floyd使用的第三个题,记录一下:
做的时候发现他居然不是无向图,而是一个双向有向图,害,可惜没看清楚题目(我觉得是题目没说好的问题(怒))
#include<iostream>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,dp[1010][1010],a[1010],u,v,c;
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dp[i][j]>dp[i][k]+dp[k][j])
dp[i][j]=dp[i][k]+dp[k][j];
}//Floyd核心代码
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
dp[i][j]=0;
else
dp[i][j]=inf;
}
}
for(int i=1;i<=m;i++)
{
cin>>u>>v>>c;
dp[u][v]=min(dp[u][v],c+a[v]);//赋值直接加上就好了
dp[v][u]=min(dp[v][u],c+a[u]);
}
floyd();
cout<<dp[1][n]-a[n];//最后记得减去最后一个点的隔离时间
}
幸好数据不强,差一点就过不了了