295B - Greg and Graph floyd
由于对Floyd的本质还是不大清楚所以做这个题还是费了点功夫,可以把整个过程反过来,就变成了解锁每个点对当前已有点的影响,其实这样也就相当于一个floyd了,值得注意的是虽然有的点没有解锁,但是是可以参与转移的,只不过累加和的时候不能加上他,为什么可以参加转移呢?因为最开始的那个k循环实际的意义就是将k这个点作为中转点来更新i和j的最短路,k是被解锁的,所以如果i和j通过k转移也是合法的,这样还不会漏掉情况
题解 P1119 【灾后重建】 - Time_Rune 的博客 - 洛谷博客 (luogu.com.cn)
#include <bits/stdc++.h>
using namespace std;
#define int long long
//const int mod=1e9+7;
const int inf=1e18;
const int N = 2e6+100;
int n,g[505][505],a[505][505],ans[505],b[505],vis[505];
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//cout<<(1LL<<19)<<endl;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
g[i][j]=a[i][j];
}
for(int i=1;i<=n;i++) cin>>b[i],vis[i]=0;
for(int k=n;k>=1;k--)
{
vis[b[k]]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
g[i][j]=min(g[i][j],g[i][b[k]]+g[b[k]][j]);
// if(k==2&&i==3&&j==4) cout<<g[i][j]<<" jjj "<<i<<" "<<j<<" "<<g[i][b[k]]<<" "<<g[b[k]][j]<<" "<<b[k]<<endl;
}
int res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
//if(k==2) cout<<g[i][j]<<" "<<i<<" "<<j<<endl;
if(vis[i]&&vis[j]) res+=g[i][j];
}
ans[k]=res;
}
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
system("pause");
return 0;
}
/*
4
0 57148 51001 13357
71125 0 98369 67226
49388 90852 0 66291
39573 38165 97007 0
2 3 1 4
*/

本文精选了几道算法题目,包括Floyd算法实现城市间最短路径计算、二元一次不定方程求解、向量求解三角形最小面积等问题,并提供了详细的代码实现。
最低0.47元/天 解锁文章
1191

被折叠的 条评论
为什么被折叠?



