zoukankan      html  css  js  c++  java
  • HDU3072 Intelligence System

    一开始想傻了,其实缩点之后,就很简单了。

    /*
    *State: HDU3072 328MS 2648K 2039 B C++ 
    *题目大意:
    *        有一个含边权有向图,然后有向图中的强连通分量里面通信不需要
    *        权值,要求从0点开始向所有的点通信,然后求最后总权值最小。
    *解题思路:
    *        看到强连通分量不需要权值即可通信,就想到缩点。缩点之后就是一个
    *       DAG,然后这个DAG里面的除了起始点0之外,所有点都要走一次,那么
    *        想清楚了其实就是每一个点有多条入度边,只需要找其中权值最小的
    *        一条入度边即可,然后实现这个过程可以在缩点的过程中实现。
    *解题感想;
    *        一看到这道题,由于心急,还是没有分析清楚,所以还搞了个spfa.这样
    *        是不行的,也证明了自己学的算法少,学的算法都不够熟练,肚子里面的
    *        墨水太少了。
    */
    View Code
      1 #include <iostream>
      2 #include <vector>
      3 #include <cstdio>
      4 #include <queue>
      5 #include <cstring>
      6 using namespace std;
      7 
      8 const int MAXN = 50005;
      9 const int MAXE = 100005;
     10 const int inf = 0x3f3f3f3f;
     11 
     12 typedef struct _node
     13 {
     14     int v, next, w;
     15 }N;
     16 N edge[MAXE];
     17 int head[MAXN], cntEdge, dfn[MAXN], low[MAXN];
     18 int step, top, inS[MAXN], myS[MAXN];
     19 int scc, id[MAXN];
     20 
     21 void init()
     22 {
     23     scc = 1;
     24     cntEdge = top = step = 0;
     25     for(int i = 0; i < MAXN; i++)
     26     {
     27         inS[i] = 0;
     28         head[i] = low[i] = dfn[i] = -1;
     29     }
     30 }
     31 
     32 void addEdge(int u, int v, int w)
     33 {
     34     edge[cntEdge].v = v;
     35     edge[cntEdge].w = w;
     36     edge[cntEdge].next = head[u];
     37     head[u] = cntEdge++;
     38 }
     39 
     40 void tarjan_scc(int n)
     41 {
     42     dfn[n] = low[n] = ++step;
     43     myS[top++] = n;
     44     inS[n] = 1;
     45     for(int f = head[n]; f != -1; f = edge[f].next)
     46     {
     47         int son = edge[f].v;
     48         if(dfn[son] == -1)
     49         {
     50             tarjan_scc(son);
     51             low[n] = min(low[n], low[son]);
     52         }
     53         else if(inS[son] == 1)
     54             low[n] = min(low[n], dfn[son]);
     55     }
     56 
     57     if(low[n] == dfn[n] && top != 0)
     58     {
     59         int tmp;
     60         do
     61         {
     62             tmp = myS[--top];
     63             id[tmp] = scc;
     64             inS[tmp] = 0;
     65         }while(top != 0 && tmp != n);
     66         scc++;
     67     }
     68 }
     69 
     70 void bulid_ADG(int n, int &sol)
     71 {
     72     int u, v, w;
     73     int edge_cost[MAXN];
     74     for(int i = 0; i < n; i++)
     75         edge_cost[i] = inf;
     76     for(int i = 0; i < n; i++)
     77     {
     78         for(int f = head[i]; f != -1; f = edge[f].next)
     79         {
     80             u = i, v = edge[f].v, w = edge[f].w;
     81             if(id[u] == id[v])
     82                 continue;
     83             else
     84             {
     85                 if(w < edge_cost[id[v]])
     86                     edge_cost[id[v]] = w;
     87             }
     88         }
     89     }
     90     sol = 0;
     91     for(int i = 1; i < scc; i++)
     92     {
     93         if(id[0] == i)
     94             continue;
     95         sol += edge_cost[i];
     96     }
     97 }
     98 
     99 //注意题目有重边
    100 int main(void)
    101 {
    102 #ifndef ONLINE_JUDGE
    103     freopen("inHDU3072.txt", "r", stdin);
    104 #endif
    105 
    106     int n, m;
    107     while(scanf("%d %d", &n, &m) == 2)
    108     {
    109         init();
    110         int u, v, w;
    111         for(int i = 0; i < m; i++)
    112         {
    113             scanf("%d %d %d", &u, &v, &w);
    114             addEdge(u, v, w);
    115         }
    116 
    117         tarjan_scc(0);
    118 
    119         int sol;
    120         bulid_ADG(n, sol);
    121         printf("%d\n", sol);
    122     }
    123     return 0;
    124 }
  • 相关阅读:
    开发记录4
    开发记录3
    豆瓣的基础架构读后感
    开发记录2
    开发记录1
    大数据技术大作业1
    新浪微博平台架构读后感
    第一阶段冲刺第五天
    第一阶段冲刺第四天
    第一阶段冲刺第三天
  • 原文地址:https://www.cnblogs.com/cchun/p/2641124.html
Copyright © 2011-2022 走看看