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 |
prime Ac 但是 prime+heap 总是wa,那位大神指点一下,感激不尽#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> using namespace std; const int MAXN = 105; const int INF = 0x3f3f3f3f; // int cost[MAXN][MAXN]; // int minCost[MAXN]; struct Edge { int to,cost; }; vector<Edge> edge[MAXN]; typedef pair<int, int> Dot; bool used[MAXN]; int costMin[MAXN]; int N; int prime() { int ret = 0; priority_queue<Dot, vector<Dot>, greater<Dot> > que; memset(costMin, INF, sizeof(costMin)); memset(used, false, sizeof(used)); costMin[0] = 0; //used[0] = true; que.push(Dot(0, 0)); for (int i = 0; i < N; i++) { Dot dot = que.top(); while(used[dot.second]) { que.pop(); dot = que.top(); } que.pop(); int v = dot.second; used[v] = true; ret += dot.first; Edge es; for (int j = 0; j < edge[v].size(); j++) { es = edge[v][j]; if (costMin[es.to] > es.cost) { costMin[es.to] = es.cost; que.push(Dot(costMin[es.to], es.to)); } } } return ret; } int main() { while(~scanf("%d", &N)) { for (int i = 0; i < N; i++) { edge[i].clear(); } Edge es; for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ es.to = j; scanf("%d", &es.cost); edge[i].push_back(es); } } int d = prime(); cout << d << 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