POJ 1258 Agri-Net
http://poj.org/problem?id=1258
裸求最小生成树
这句话好像没什么影响"Physically, they are limited in length to 80 characters, so some lines continue onto others"
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <queue> 5 #define READ() freopen("in.txt", "r", stdin); 6 #define MAXV 20007 7 #define INF 0x3f3f3f3f 8 using namespace std; 9 10 typedef pair<int,int> P; 11 int N; 12 struct Edge 13 { 14 int to, cost, next; 15 Edge () {} 16 Edge(int to, int cost, int next) : to(to), cost(cost), next(next) {} 17 }edge[MAXV]; 18 19 int head[MAXV]; 20 int num = 0; 21 22 void Add(int from, int to, int cost) 23 { 24 edge[num] = Edge(to, cost, head[from]); 25 head[from] = num++; 26 } 27 28 int prim() 29 { 30 int res = 0; 31 int dist[MAXV]; 32 bool use[MAXV]; 33 priority_queue<P, vector<P>, greater<P> > que; 34 fill(dist, dist+MAXV, INF); 35 fill(use, use+MAXV, false); 36 dist[1] = 0; 37 que.push(P(dist[1], 1)); 38 while (!que.empty()) 39 { 40 P p = que.top(); 41 que.pop(); 42 int v = p.second, d = p.first; 43 if (!use[v])//** 44 { 45 res += dist[v]; 46 } 47 use[v]= true; 48 if (dist[v] < d) continue; 49 int t = head[v]; 50 while (t != -1) 51 { 52 Edge e = edge[t]; 53 if (!use[e.to] && dist[e.to] > e.cost)//** 54 { 55 dist[e.to] = e.cost; 56 que.push(P(dist[e.to], e.to)); 57 } 58 t = e.next; 59 } 60 } 61 return res; 62 } 63 64 65 int main() 66 { 67 READ() 68 while(~scanf("%d", &N)) 69 { 70 int cost; 71 num = 0; 72 memset(head, -1, sizeof(head)); 73 memset(edge, -1, sizeof(edge)); 74 for (int i = 1; i <= N ;i ++) 75 { 76 for (int j = 1; j <= N; j++) 77 { 78 scanf("%d", &cost); 79 if (i == j) continue; 80 Add(i, j, cost); 81 Add(j, i, cost); 82 } 83 } 84 int ans = prim(); 85 cout << ans << endl; 86 } 87 88 }