• [ An Ac a Day ^_^ ] [kuangbin带你飞]专题六 最小生成树 POJ 1251 Jungle Roads


    题意:

    有n个点 每个点上有一些道路 求最小生成树

    解释下输入格式

    A n v1 w1 v2 w2

    A点上有n条边 A到v1权值是w1 A到v2权值是w2

    思路:

    字符串处理之后跑kruskal求最小生成树

      1 /* ***********************************************
      2 Author        :Sun Yuefeng
      3 Created Time  :2016/11/9 18:26:37
      4 File Name     :tree.cpp
      5 ************************************************ */
      6 
      7 #include<cstdio>
      8 #include<iostream>
      9 #include<algorithm>
     10 #include<cmath>
     11 #include<cstring>
     12 #include<string>
     13 #include<bitset>
     14 #include<map>
     15 #include<set>
     16 #include<stack>
     17 #include<vector>
     18 #include<queue>
     19 #include<list>
     20 #define M(a,b) memset(a,b,sizeof(a))
     21 using namespace std;
     22 typedef long long ll;
     23 const int inf=0x3f3f3f3f;
     24 const int maxn=30;
     25 const int maxm=80;
     26 const int mod=1e7+7;
     27 int dx[8]= {0,0,1,-1,1,-1,1,-1};
     28 int dy[8]= {1,-1,0,0,-1,1,1,-1};
     29 
     30 int f[maxn],tol,n;
     31 
     32 struct _edge
     33 {
     34     int u,v,w;
     35     friend bool operator < (const _edge a,const _edge b)
     36     {
     37         return a.w<b.w;
     38     }
     39 }edge[maxm];
     40 
     41 void addedge(int u,int v,int w) //加边
     42 {
     43     edge[tol].u=u;
     44     edge[tol].v=v;
     45     edge[tol].w=w;
     46     tol++;
     47 }
     48 
     49 int _find(int x) //并查集
     50 {
     51     if(f[x]==-1) return x;
     52     else return f[x]=_find(f[x]);
     53 }
     54 
     55 int kruskal()
     56 {
     57     M(f,-1);
     58     sort(edge,edge+tol); //把所有的边排序
     59     int cnt=0,ans=0;
     60     int u,v,w,f1,f2;
     61     for(int i=0;i<tol;i++) //从权值最小的边开始加
     62     {
     63         u=edge[i].u;
     64         v=edge[i].v;
     65         w=edge[i].w;
     66         f1=_find(u);
     67         f2=_find(v);
     68         if(f1!=f2) //判断是否成环
     69         {
     70             ans+=w;
     71             f[f1]=f2;
     72             cnt++;
     73         }
     74         if(cnt==n-1) break;
     75     }
     76     //if(cnt<n-1) return -1; 判断图是否连通
     77     return ans;
     78 }
     79 
     80 int main()
     81 {
     82     //freopen("in.txt","r",stdin);
     83     //freopen("out.txt","w",stdout);
     84     while(scanf("%d",&n)!=EOF&&n)
     85     {
     86         tol=0;
     87         for(int i=0;i<n-1;i++)
     88         {
     89             char str[2];
     90             int num,u,v,w;
     91             scanf("%s",str);
     92             u=str[0]-'A';
     93             scanf("%d",&num);
     94             while(num--)
     95             {
     96                 scanf("%s",str);
     97                 v=str[0]-'A';
     98                 scanf("%d",&w);
     99                 addedge(u,v,w);
    100             }
    101         }
    102         printf("%d
    ",kruskal());
    103     }
    104     return 0;
    105 }
    106 /*
    107 
    108 9
    109 A 2 B 12 I 25
    110 B 3 C 10 H 40 I 8
    111 C 2 D 18 G 55
    112 D 1 E 44
    113 E 2 F 60 G 38
    114 F 0
    115 G 1 H 35
    116 H 1 I 35
    117 3
    118 A 2 B 10 C 40
    119 B 1 C 20
    120 0
    121 
    122 */
  • 相关阅读:
    poj1047
    poj1129
    poj1050
    C#中break、continue的用法
    关于一个不大常用的SQL数据类型-UNIQUEIDENTIFIER
    关于net2.0里面新出现的类backgroundworker的应用
    深入讲解SQL Union和Union All的使用方法
    让你一次性搞定堆、栈、值类型、引用类型 (转载)
    EXEC与sp_executesql的区别及应用(转)
    几种常用排序算法总结(转载)
  • 原文地址:https://www.cnblogs.com/general10/p/6048144.html
Copyright © 2020-2023  润新知