Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
提供个思路,可以使用dijkstra算法,将松弛条件修改修改为两条松弛边均小于原边,即将两条松弛边的较大的那条置为新的值 #include <iostream> #include <cmath> #include <limits> #include <cstring> #include <iomanip> using namespace std; const double doubleMax = numeric_limits<double>::max(); struct STONES // (0 <= xi,yi <= 1000) { int x; int y; }; double distance(int x1, int y1, int x2, int y2) { return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); } int main() { int n; //2<=n<=200 int i, j; cin >> n; int t = 1; while(n != 0) { STONES *stones = new STONES[n]; double **arr_dis = new double*[n]; for(i = 0; i < n; ++i) { arr_dis[i] = new double[n]; for(j = 0; j < n; ++j) arr_dis[i][j] = doubleMax; } for(i = 0; i < n; ++i) { int x,y; cin >> x >> y; stones[i].x = x; stones[i].y = y; } for(i = 0; i < n; ++i) { for(j = 0; j < i; ++j) { arr_dis[i][j] = distance(stones[i].x, stones[i].y, stones[j].x, stones[j].y); arr_dis[j][i] = arr_dis[i][j]; } arr_dis[i][i] = 0; } double *min_dis = new double[n]; for(int i = 0; i < n; ++i) min_dis[i] = arr_dis[0][i]; int *visited = new int[n]; memset(visited, 0, sizeof(int) * n); visited[0] = 1; for(i = 1; i < n; ++i) { double min = doubleMax; int min_idx; for(j = 0; j < n; ++j) { if(visited[j] == 0 && min > min_dis[j]) { min = min_dis[j]; min_idx = j; } } visited[min_idx] = 1; for(j = 0; j < n; ++j) { if(arr_dis[min_idx][j] != doubleMax) { //if(min_dis[min_idx] < min_dis[j] && arr_dis[min_idx][j] < min_dis[j]) if(min_dis[min_idx] < min_dis[j] && arr_dis[min_idx][j] < min_dis[j]) { if(min_dis[min_idx] > arr_dis[min_idx][j]) min_dis[j] = min_dis[min_idx]; else min_dis[j] = arr_dis[min_idx][j]; } } } } //for(i = 0; i < n; ++i) cout << min_dis[i] << " "; //cout << endl; cout << "Scenario #" << t << endl; cout << fixed << setprecision(3) << "Frog Distance = " << min_dis[1] << endl; cout << endl; delete [] visited; delete [] min_dis; for(i = 0; i < n; ++i) delete [] arr_dis[i]; delete [] arr_dis; delete [] stones; cin >> n; t++; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator