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 |
第一次一遍过 , 纪念一下。最小生成树问题-prim算法#include <iostream> #include <vector> //---------------------------------------- using namespace std; //---------------------------------------- struct edge { int power; bool donebefore; }; struct country { int x; int y; }; //---------------------------------------- int main() { int N , M; cin >> N; const int n = N; country cou[n]; for (int i = 0 ; i < n ; i++) { cin >> cou[i].x >> cou[i].y; } vector< vector<edge> > head(N); for (int i = 0 ; i < n ; i++) { vector<edge> temp(n); int nowcountry = i; for (int j = 0 ; j < n ; j++) { if (j == nowcountry) { edge tt; tt.power = -1; tt.donebefore = true; temp[j] = tt; } else { edge tt; tt.power = (cou[nowcountry].x - cou[j].x) * (cou[nowcountry].x - cou[j].x) + (cou[nowcountry].y - cou[j].y) * (cou[nowcountry].y - cou[j].y); tt.donebefore = false; temp[j] = tt; } } head[i] = temp; } cin >> M; for (int i = 0 ; i < M ; i++) { int from , to; cin >> from >> to; head[from - 1][to - 1].power = 0; head[from - 1][to - 1].donebefore = true; head[to - 1][from - 1].power = 0; head[to - 1][from - 1].donebefore = true; //cout << head[from - 1][to - 1].power << endl; } cout << endl; const int INF = 210000000; int lowcost[n]; int ver[n]; int marked[n]; for (int i = 1 ; i < n ; i++) { lowcost[i] = head[0][i].power; ver[i] = 0; marked[i] = 0; } marked[0] = 1; lowcost[0] = 0; ver[0] = -1; for (int i = 0 ; i < n - 1 ; i++) { int ldist = INF; int u; for (int j = 0 ; j < n ; j++) { if (lowcost[j] < ldist && marked[j] == 0) { ldist = lowcost[j]; u = j; } } marked[u] = 1; for (int p = 0 ; p < n ; p++) { if (p == u) { continue; } if (head[u][p].power < lowcost[p] && marked[p] == 0) { lowcost[p] = head[u][p].power; ver[p] = u; } } } for (int i = 0 ; i < n ; i++) { if (ver[i] != -1) { if (!head[ver[i]][i].donebefore) { cout << ver[i] + 1 << " " << i + 1 << endl; } } } //cout << "Hello world!" << endl; return 0; } //---------------------------------------- 虽然还没有完全掌握最小生成树 , 不过还是有点小激动。 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator