USACO算法系列十三——butter

      题目:http://www.nocow.cn/index.php/Translate:USACO/butter

      题目大意是找出一个牧场,使得奶牛到这个牧场的路径和最小。

      最原始的想法是计算出这些牧场内部之间的最短路径,根据map[i][j] = min( map[i][j], map[i][k] + map[k][j]),然后所有奶牛到牧场路径和为 {求和cube[j] * map[i][j],j 从 1~MAX};(cube[j] 指第j个牧场的奶牛数)。因此代码如下:

#include <iostream> #include <fstream> #define MAX 801 #define LARGE 240000 using namespace std; //奶牛n,p:牧场 c:道路 int n,p,c; int cube[MAX] = {0}; int map[MAX][MAX] = {0}; int main() { ifstream fin("butter.in"); ofstream fout("butter.out"); //输入数据 fin >> n >> p >> c; for (int i =0; i < n; i ++) { int index =0; fin >> index; cube[index] ++; } //初始化矩阵 for(int i=1; i<MAX; i ++ ) { for (int j=i+1; j < MAX; j ++) { map[i][j] = LARGE; map[j][i] = LARGE; } } for (int i =0; i <c; i ++) { int r=0,c=0, w =0; fin >> r >> c >> w; map[r][c] = w; map[c][r] = w; } //计算整个矩阵的最短通路 for(int k=1; k < MAX; k ++) { for (int i=1; i< MAX; i ++) { for (int j=1; j < MAX; j ++) { if (map[i][k] + map[k][j] < map[i][j]) { map[i][j] = map[i][k] + map[k][j]; } } } } //计算最短的数 int result = -1; for (int i=1; i < MAX; i ++) { int temp = 0; for (int j=1; j < MAX; j ++) { temp += cube[j] * map[j][i]; } if (result == -1 || temp < result) { result = temp; } } fout << result << endl; return 0; } Executing... > Run 1: Execution error: Your program (`butter') used more than the allotted runtime of 1 seconds (it ended or was stopped at 1.674 seconds) when presented with test case 1. It used 5520 KB of memory. ------ Data for Run 1 ------ 3 4 5 2 3 4 1 2 1 1 3 5 2 3 7 2 4 3 3 4 5 ---------------------------- Test 1: RUNTIME 1.674>1 (5520 KB)

     但是运行的时候居然超时了,分析了一下,我以为800的数据量很小,但是里面有个三重循环,也就是时间复杂度为o(800^3)。差不多在5千万左右,而一秒能够执行的代码行数为1千万行左右,因此确实超时了。

     至于怎么优化,现在还没想好。晚上再好好解决吧,感觉基础知识还不够扎实。

你可能感兴趣的:(c,算法,优化)