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 }

 

posted @ 2017-02-15 23:38  Lorazepam  阅读(194)  评论(0编辑  收藏  举报