zoukankan      html  css  js  c++  java
  • spanning tree

    讲得挺好的:Spanning Tree

    强联通图:边为  c=v*(v-1)/2

    uva,544

    kruskal求最大生成树,然后求数边里面最小的限制。用到了剪枝的方法,把字符串映射成整数,然后跑一遍就过了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <sstream>
     6 #include <map>
     7 #include <algorithm>
     8 
     9 using namespace std;
    10 const int maxn=205;
    11 map<string,int> mp;
    12 int val;
    13 int start;
    14 int tar;
    15 int hash[maxn];
    16 int pos;
    17 int n,r;
    18 struct Edge
    19 {
    20     int u,v;
    21     int weight;
    22     bool operator<(const Edge& x)const
    23     {
    24         return weight>x.weight;
    25     }
    26 }E[maxn*maxn];
    27 
    28 int parent[maxn];
    29 int find(int y)
    30 {
    31     return y==parent[y]?y:parent[y]=find(parent[y]);
    32 }
    33 
    34 void Kruskal()
    35 {
    36     for(int i=0;i<pos;i++)
    37     {
    38         int pa=find(E[i].u);
    39         int pb=find(E[i].v);
    40         if(pa!=pb)
    41             parent[pa]=pb;
    42         if(find(start)==find(tar))
    43         {
    44             val=E[i].weight;
    45             return;
    46         }
    47     }
    48 }
    49 
    50 int main()
    51 {
    52     int cas=1;
    53     string s1,s2;
    54     int tmp;
    55     while(scanf("%d%d",&n,&r) && n+r)
    56     {
    57         int cnt=0;
    58         pos=0;
    59         mp.clear();
    60         for(int i=0;i<n;i++)
    61             parent[i]=i;
    62         for(int i=0;i<r;i++)
    63         {
    64             cin>>s1>>s2>>tmp;
    65             if(!mp[s1])
    66                 mp[s1]=cnt++;
    67             if(!mp[s2])
    68                 mp[s2]=cnt++;
    69             E[pos].u=mp[s1];
    70             E[pos].v=mp[s2];
    71             E[pos++].weight=tmp;
    72         }
    73         cin>>s1>>s2;
    74         start=mp[s1];
    75         tar=mp[s2];
    76         sort(E,E+r);
    77         
    78         Kruskal();
    79         
    80         printf("Scenario #%d
    %d tons
    
    ",cas++,val);
    81     }
    82     return 0;
    83 }
    View Code

     uva,10034

    注意一下输入,每两个用例之间有换行,但是最后一个用例之后没有换行。。pr了几次

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 const int maxn=105;
     8 int n;
     9 int pos;
    10 double result;
    11 
    12 struct Point
    13 {
    14     double x,y;
    15     void read()
    16     {
    17         scanf("%lf%lf",&x,&y);
    18     }
    19 }p[maxn];
    20 
    21 double dist(Point a,Point b)
    22 {
    23     double dx=a.x-b.x;
    24     double dy=a.y-b.y;
    25     return sqrt(dx*dx+dy*dy);
    26 }
    27 
    28 
    29 struct Edge
    30 {
    31     int u,v;
    32     double dis;
    33     Edge(){}
    34     Edge(int x,int y)
    35     {
    36         this->u=x;
    37         this->v=y;
    38         dis=dist(p[x],p[y]);
    39     }
    40     
    41     bool operator<(const Edge& a)const
    42     {
    43         return dis<a.dis;
    44     }
    45 }E[maxn*maxn];
    46 int parent[maxn];
    47 
    48 int find(int x)
    49 {
    50     return x==parent[x]?x:parent[x]=find(parent[x]);
    51 }
    52 
    53 void Kruskal()
    54 {
    55     for(int i=0;i<pos;i++)
    56     {
    57         int pa=find(E[i].u);
    58         int pb=find(E[i].v);
    59         if(pa!=pb)
    60         {
    61             parent[pa]=pb;
    62             result+=E[i].dis;
    63         }
    64     }
    65 }
    66 
    67 int main()
    68 {
    69     int t;
    70     scanf("%d
    ",&t);  //cin>>t;也可以
    71     while(t--)
    72     {
    73         result=0;
    74         pos=0;
    75         scanf("%d",&n);
    76         for(int i=0;i<n;i++)
    77         {
    78             parent[i]=i;
    79             p[i].read();
    80             for(int j=0;j<i;j++)
    81             {
    82                 E[pos++]=Edge(i,j);
    83             }
    84         }
    85         sort(E,E+pos);
    86         Kruskal();
    87         printf("%.2lf
    ",result);
    88         if(t)
    89             printf("
    ");
    90     }
    91     return 0;
    92 }
    View Code

    uva,10048

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 const int maxn=100;
     7 int start,tar;
     8 int C,S,Q;
     9 int flag;
    10 
    11 struct Edge{
    12     int u,v;
    13     int dec;
    14     bool operator<(const Edge& a)const
    15     {
    16         return dec<a.dec;
    17     }
    18 }E[1010];
    19 
    20 struct query
    21 {
    22     int a,b;
    23 }q[10010];
    24 
    25 int parent[maxn];
    26 
    27 int find(int x)
    28 {
    29     return x==parent[x] ? x : parent[x]=find(parent[x]);
    30 }
    31 
    32 void Kruskal()
    33 {
    34     for(int i=0;i<S;i++)
    35     {
    36         int pa=find(E[i].u);
    37         int pb=find(E[i].v);
    38         
    39         if(pa!=pb)
    40             parent[pa]=pb;
    41         if(find(start)==find(tar))
    42         {
    43             flag=1;
    44             printf("%d
    ",E[i].dec);
    45             return;
    46         }
    47     }
    48 }
    49 
    50 int main()
    51 {
    52     int cas=1;
    53     while(scanf("%d%d%d",&C,&S,&Q) && C+S+Q)
    54     {
    55         for(int i=0;i<S;i++)
    56         {
    57             scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].dec);
    58         }
    59         sort(E,E+S);
    60         
    61         for(int i=0;i<Q;i++)
    62         {
    63             scanf("%d%d",&q[i].a,&q[i].b);  //不能一边输入一边输出
    64 //wa了几次,晕
    65         }
    66         
    67         if(cas!=1)
    68             printf("
    ");  //这个点要注意,要不然就pr
    69         printf("Case #%d
    ",cas++);
    70         
    71         for(int i=0;i<Q;i++)
    72         {
    73             flag=0;
    74             for(int i=1;i<=C;i++)
    75                 parent[i]=i;
    76             start=q[i].a;tar=q[i].b;
    77             Kruskal();
    78             if(!flag)
    79                 printf("no path
    ");
    80         }
    81     }
    82     return 0;
    83 }
    View Code

     uva,10397

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cmath>
     5 
     6 using namespace std;
     7 const int maxn=760;
     8 int N,M;
     9 int pos;
    10 double result;
    11 
    12 struct cable
    13 {
    14     int a,b;
    15 }p[1010];
    16 
    17 struct Point
    18 {
    19     int x,y;
    20     void read()
    21     {
    22         scanf("%d%d",&x,&y);
    23     }
    24 }q[maxn];
    25 
    26 double dist(Point a,Point b)
    27 {
    28     int dx=a.x-b.x;
    29     int dy=a.y-b.y;
    30     return sqrt(dx*dx+dy*dy);
    31 }
    32 
    33 struct Edge
    34 {
    35     int u,v;
    36     double dis;
    37     Edge(){}
    38     Edge(int x,int y)
    39     {
    40         this->u=x;
    41         this->v=y;
    42         dis=dist(q[x],q[y]);
    43     }
    44     bool operator<(const Edge& a)const
    45     {
    46         return dis<a.dis;
    47     }
    48 }E[maxn*maxn];
    49 
    50 int parent[maxn];
    51 int find(int x)
    52 {
    53     return x==parent[x] ? x:parent[x]=find(parent[x]);
    54 }
    55 
    56 void Kruskal()
    57 {
    58     for(int i=0;i<pos;i++)
    59     {
    60         int pa=find(E[i].u);
    61         int pb=find(E[i].v);
    62         if(pa!=pb)
    63         {
    64             parent[pa]=pb;
    65             result+=E[i].dis;
    66         }
    67         
    68     }
    69 }
    70 
    71 int main()
    72 {
    73     while(~scanf("%d",&N))
    74     {
    75         pos=0;
    76         for(int i=0;i<N;i++)
    77         {
    78             parent[i]=i;
    79             q[i].read();
    80             for(int j=0;j<i;j++)
    81                 E[pos++]=Edge(i,j);
    82         }
    83         
    84         scanf("%d",&M);
    85         int m,n;
    86         for(int i=0;i<M;i++)
    87         {
    88             scanf("%d%d",&m,&n);
    89             int pa=find(m-1);
    90             int pb=find(n-1);
    91             if(pa!=pb)
    92                 parent[pa]=pb; //直接做父亲,然后就就相当于标记了为0
    93         }
    94         sort(E,E+pos);
    95         result=0;
    96         Kruskal();
    97         printf("%.2lf
    ",result);
    98     }
    99 }
    View Code
    活在现实,做在梦里。
  • 相关阅读:
    【Log Explorer】查看和恢复数据库数据
    【MSMQ】消息队列(Message Queue)简介及其使用
    【核心对象】我心目中的Asp.net核心对象
    【SQL Server】CROSS APPLY和OUTER APPLY的应用详解
    【批处理】时间处理
    15件事造就有理想的程序员
    IE8下定义IE=EmulateIE7与IE=7的区别
    【批处理】创建快捷方式
    Ghost备份出错导致磁盘空间被占用
    【AJAX】反向Ajax第1部分:Comet介绍
  • 原文地址:https://www.cnblogs.com/do-it-best/p/5421619.html
Copyright © 2011-2022 走看看