您的位置:首页 > 其它

Codeforces 295B floyd

2014-08-11 13:02 197 查看
题意:对一个带权有向图,每次删除一个点,求删除该点前当前图的所有点间的最短距离之和。

今天大整理,把没发博客的发了吧,也是温故一下

这题做之前没忍住瞄了题解,好吧惭愧,不过不看的话大概我不会用floyd,也不会想到把删除操作反过来,相当于添加.....

思路就是每次加进来点都进行松弛d[ii][jj]=d[ii][kk]+d[kk][jj];

写的时候注意下标...

好吧大概只有我这种连写搜索都会因为下标很纠结的人才需要注意orz....

#include<stdio.h>
#define N 510
#define ll long long

ll d

,del
,ans
,n;

void floyd()
{
for(int k=0;k<n;k++)
{
ll temp=0;
int kk=del[k];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int ii=del[j];
int jj=del[i];
if(d[ii][jj]>d[ii][kk]+d[kk][jj])
d[ii][jj]=d[ii][kk]+d[kk][jj];
if(j<=k&&i<=k)
temp+=d[ii][jj];
}
}
ans[n-k-1]=temp;
}
}

int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%I64d",&d[i][j]);
for(int i=0;i<n;i++)
{
scanf("%I64d",&del[n-i-1]);
del[n-i-1]--;
}
floyd();
for(int i=0;i<n;i++)
printf("%I64d ",ans[i]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: