Codeforces 295B floyd
2014-08-11 13:02
197 查看
题意:对一个带权有向图,每次删除一个点,求删除该点前当前图的所有点间的最短距离之和。
今天大整理,把没发博客的发了吧,也是温故一下
这题做之前没忍住瞄了题解,好吧惭愧,不过不看的话大概我不会用floyd,也不会想到把删除操作反过来,相当于添加.....
思路就是每次加进来点都进行松弛d[ii][jj]=d[ii][kk]+d[kk][jj];
写的时候注意下标...
好吧大概只有我这种连写搜索都会因为下标很纠结的人才需要注意orz....
今天大整理,把没发博客的发了吧,也是温故一下
这题做之前没忍住瞄了题解,好吧惭愧,不过不看的话大概我不会用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; }
相关文章推荐
- Codeforces 479B Towers(暴力)
- CodeForces 176A Trading Business 贪心
- CodeForces 455B A Lot of Games
- Codeforces 758A. Holiday Of Equality 贪心
- codeforces 118B Present from Lena
- Codeforces 908D New Year and Arbitrary Arrangement
- CodeForces 55D Beautiful numbers
- Codeforces 432A Choosing Teams
- CodeForces 540A Combination Lock
- Codeforces 762A k-th divisor
- CodeForces - 698A Vacations 贪心 dp
- CodeForces - 908B New Year and Buggy Bot (DFS)
- CodeForces - 1B Spreadsheets
- CodeForces 164 B. Ancient Berland Hieroglyphs 单调队列
- Codeforces 691D Swaps in Permutation
- Codeforces 761C-Dasha and Password
- The Tag Game(CodeForces - 813C)
- codeForces 898C. Phone Numbers
- 【二分法】codeforces 460C
- CodeForces 620E New Year Tree