• poj 2485 Highways


    http://poj.org/problem?id=2485

      稍微变形的MST,只要改一改变量的意义就行了!

    View Code
      1 #include <cstdio>
      2 #include <iostream>
      3 #include <cstring>
      4 
      5 using namespace std;
      6 const int MAXV = 505, MAXE = 505 * 505, INF = (~0u)>>2;
      7 struct edge{
      8     int t, w, next;
      9 }es[MAXE << 1];
     10 int h[MAXV], cnt, n, heap[MAXV << 1], size, pos[MAXV], dist[MAXV];
     11 
     12 void init(){
     13     cnt = size = 0;
     14     memset(h, 0, sizeof(h));
     15     memset(heap, 0, sizeof(heap));
     16     memset(pos, 0, sizeof(pos));
     17     memset(dist, 0, sizeof(dist));
     18 }
     19 
     20 void addedge(int x, int y, int z){
     21     es[++cnt].t = y;
     22     es[cnt].next = h[x];
     23     es[cnt].w = z;
     24     h[x] = cnt;
     25 }
     26 
     27 void heapup(int k){
     28     while(k > 1){
     29         if(dist[heap[k >> 1]] > dist[heap[k]]){
     30             swap(pos[heap[k >> 1]], pos[heap[k]]);
     31             swap(heap[k >> 1], heap[k]);
     32             k >>= 1;
     33         }
     34         else break;
     35     }
     36 }
     37 void heapdown(int k){
     38     while((k << 1) <= size){
     39         int j;
     40         if((k << 1) == size || dist[heap[k << 1]] < dist[heap[k << 1 | 1]])
     41             j = k << 1;
     42         else
     43             j = k << 1 | 1;
     44         if(dist[heap[k]] > dist[heap[j]]){
     45             swap(pos[heap[k]], pos[heap[j]]);
     46             swap(heap[k], heap[j]);
     47             k = j;
     48         }
     49         else break;
     50     }
     51 }
     52 void push(int v, int d){
     53     dist[v] = d;
     54     heap[++size] = v;
     55     pos[v] = size;
     56     heapup(size);
     57 }
     58 
     59 int pop(){
     60     int ret = heap[1];
     61     swap(pos[heap[size]], pos[heap[1]]);
     62     swap(heap[size], heap[1]);
     63     size--;
     64     heapdown(1);
     65     return ret;
     66 }
     67 
     68 int prim(){
     69     int mst = 0, i, p;
     70 
     71     push(1, 0);
     72     for(i = 2; i <= n; i++)
     73         push(i, INF);
     74     for(i = 1; i <= n; i++){
     75         int t = pop();
     76         if (mst < dist[t]) mst = dist[t];
     77         pos[t] = -1;
     78         for(p = h[t]; p; p = es[p].next){
     79             int dst = es[p].t;
     80             if(pos[dst] != -1 && dist[dst] > es[p].w){
     81                 dist[dst] = es[p].w;
     82                 heapup(pos[dst]);
     83                 heapdown(pos[dst]);
     84             }
     85         }
     86     }
     87     return mst;
     88 }
     89 
     90 void deal(){
     91     int c;
     92 
     93     for (int i = 1; i <= n; i++){
     94         for (int j = 1; j <= n; j++){
     95             scanf("%d", &c);
     96             if (i != j){
     97                 addedge(i, j, c);
     98             }
     99         }
    100     }
    101     printf("%d\n", prim());
    102 }
    103 
    104 int main(){
    105 #ifndef ONLINE_JUDGE
    106     freopen("in", "r", stdin);
    107 #endif
    108     int T;
    109 
    110     scanf("%d", &T);
    111     while (T-- && ~scanf("%d", &n)){
    112         init();
    113         deal();
    114     }
    115 
    116     return 0;
    117 }

    ——written by Lyon

  • 相关阅读:
    面试知识点2
    面试知识点3
    面试知识记录
    JQuery手写一个简单的轮播图
    推荐一款好用的日历插件
    JQuery获取复选框的值
    JQuery手写一个简单的分页
    JQuery给一个元素绑定两次点击事件(第二次点击事件)
    懒加载预加载(图片)
    JQuery Ajax 使用FormData上传文件对象
  • 原文地址:https://www.cnblogs.com/LyonLys/p/poj_2485_Lyon.html
Copyright © 2020-2023  润新知