您好,欢迎来到外链网!
当前位置:外链网 » 站长资讯 » 专业问答 » 文章详细 订阅RssFeed

算法竞赛专题解析

来源:互联网 浏览:117次 时间:2023-04-08

题目:


题目分析:
设d[i][j]为i去到j所需要的最少改动,我们可以将最少改动看成距离,因此我们就可以得到一个距离矩阵,从而通过dijkstra算法求出最短距离

#include <algorithm>using namespace std;const int N = 300 + 5;int a[N][N];int d[N][N];int main() { int n; cin >> n; memset(d, 63, sizeof d); for(int i = 0; i < n; ++ i) for(int j = 0; j < n; ++ j) cin >> a[i][j]; for(int i = 0; i < n; ++ i) for(int j = 0, k = 0;j < n; ++ j) if(a[i][j]) 香港vps d[i][j] = k ++; for(int k = 0; k < n; ++ k) for(int i = 0; i < n; ++ i) for(int j = 0; j < n; ++ j) d[i][j] = min(d[i][j], d[i][k] + d[k][j]); int ans = d[0][n-1] < 1 << 25 ? d[0][n-1] : -1; cout << ans << endl;}

代码分析:
1.memset初始化可以更大,取到300+
2.d[i][j]记录第i行中第j个前全部1的总数,即可以认为为i到j的最短距离
3.3层循环这里明显用的是dijkstra算法,只不过是一个未经优化的算法,但时间上可以忍受

总结:
1.dijkstra的无脑写法
2.<<表示乘2

16416034