zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    基础总结篇之一:Activity生命周期
    putExtra方法
    fork函数
    linux中fork()函数详解(原创!!实例讲解) (转载)
    系统调用wait、waitpid和exec函数
    版本控制工具VSS使用介绍
    学习进度条六(第七周)
    阶段冲刺4
    阶段冲刺3
    阶段冲刺2
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6403909.html
Copyright © 2011-2022 走看看