zoukankan      html  css  js  c++  java
  • 最小生成树kruskal+prim

     1 #include<cstdio> 
     2 #include<cstring>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 #include<set>
     8 #define maxint (2147483647)
     9 #define l(a) ((a)<<1)
    10 #define r(a) ((a)<<1|1)
    11 #define b(a) (2<<(a))
    12 #define rep(i,a,b) for(int i=a;i<=(b);i++)
    13 #define clr(a) memset(a,0,sizeof(a))
    14 typedef long long ll;
    15 using namespace std;
    16 int readint(){
    17     int t=0,f=1;char c=getchar();
    18     while(!isdigit(c)){
    19         if(c=='-') f=-1;
    20         c=getchar();
    21     }
    22     while(isdigit(c)){
    23         t=(t<<3)+(t<<1)+c-'0';
    24         c=getchar();
    25     }
    26     return t*f;
    27 }
    28 const int maxn=5009,maxm=200009;
    29 struct edge{
    30     int u,v,w;
    31     inline bool operator <(edge E)const{
    32         return w<E.w;
    33     }
    34 }e[maxm];
    35 int n,m,f[maxn];
    36 int find(int x){
    37     if(f[x]==x) return f[x];
    38     return f[x]=find(f[x]);
    39 }
    40 int kruskal(){
    41     int ans=0;
    42     sort(e+1,e+m+1); 
    43     rep(i,1,n) f[i]=i;
    44     rep(i,1,m){
    45         if(find(e[i].u)!=find(e[i].v)){
    46             f[find(e[i].u)]=find(e[i].v);
    47             ans+=e[i].w;
    48         }
    49     }
    50     return ans;
    51 }
    52 int main(){
    53     //freopen("#input.txt","r",stdin);
    54     //freopen("#output.txt","w",stdout);
    55     n=readint();m=readint();
    56     rep(i,1,m){
    57         e[i].u=readint();
    58         e[i].v=readint();
    59         e[i].w=readint();
    60     }
    61     cout<<kruskal()<<endl;
    62     //fclose(stdin);
    63     //fclose(stdout);
    64     return 0;
    65 }
    kruskal
     1 #include<cstdio> 
     2 #include<cstring>
     3 #include<cmath>
     4 #include<ctime>
     5 #include<iostream>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<set>
     9 #define maxint (2147483647)
    10 #define l(a) ((a)<<1)
    11 #define r(a) ((a)<<1|1)
    12 #define b(a) (1<<(a))
    13 #define rep(i,a,b) for(int i=a;i<=(b);i++)
    14 #define clr(a) memset(a,0,sizeof(a))
    15 typedef long long ll;
    16 using namespace std;
    17 int readint(){
    18     int t=0,f=1;char c=getchar();
    19     while(!isdigit(c)){
    20         if(c=='-') f=-1;
    21         c=getchar();
    22     }
    23     while(isdigit(c)){
    24         t=(t<<3)+(t<<1)+c-'0';
    25         c=getchar();
    26     }
    27     return t*f;
    28 }
    29 ll readll(){
    30     ll t=0ll,f=1ll;char c=getchar();
    31     while(!isdigit(c)){
    32         if(c=='-') f=-1ll;
    33         c=getchar();
    34     }
    35     while(isdigit(c)){
    36         t=(t<<3ll)+(t<<1ll)+ll(c-'0');
    37         c=getchar();
    38     }
    39     return t*f;
    40 }
    41 struct edge{
    42     int v,w;
    43     edge*next;
    44     inline edge(int V,int W){
    45         v=V;w=W;
    46     }
    47     inline edge(){}
    48     inline bool operator<(const edge E)const{
    49         return w>E.w||(w==E.w&&v>E.v);
    50     }
    51 };
    52 const int maxn=1009,maxm=50009;
    53 int n,m,t,ans;
    54 bool p[maxn];
    55 edge e[maxm],*pt=e,*fir[maxn];
    56 priority_queue<edge>Q;
    57 void add(int u,int v,int w){
    58     pt->v=v;pt->w=w;pt->next=fir[u];
    59     fir[u]=pt++;
    60 }
    61 void Dfs(int x){
    62     p[x]=1;
    63     for(edge*E=fir[x];E;E=E->next) if(!p[E->v]) Q.push(*E);
    64     while(!Q.empty()&&p[Q.top().v]) Q.pop();
    65     if(Q.empty()) return;
    66     edge E=Q.top();Q.pop();
    67     ans+=E.w;
    68     Dfs(E.v);
    69 }
    70 int main(){
    71     //freopen("#input.txt","r",stdin);
    72     //freopen("#output.txt","w",stdout);
    73     n=readint();m=readint();
    74     rep(i,1,m){
    75         int u=readint(),v=readint(),w=readint();
    76         add(u,v,w);add(v,u,w);t+=w;
    77     }
    78     Dfs(1);
    79     cout<<ans<<endl;
    80     //fclose(stdin);
    81     //fclose(stdout);
    82     return 0;
    83 }
    prim

    MST问题中注意加双向边!!!

    上面的prim姿势好像有问题

     1 #include<cstdio> 
     2 #include<cstring>
     3 #include<cmath>
     4 #include<ctime>
     5 #include<iostream>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<set>
     9 #define inf (0x7fffffff)
    10 #define l(a) ((a)<<1)
    11 #define r(a) ((a)<<1|1)
    12 #define b(a) (1<<(a))
    13 #define rep(i,a,b) for(int i=a;i<=(b);i++)
    14 #define clr(a) memset(a,0,sizeof(a))
    15 typedef long long ll;
    16 typedef unsigned long long ull;
    17 using namespace std;
    18 int readint(){
    19     int t=0,f=1;char c=getchar();
    20     while(!isdigit(c)){
    21         if(c=='-') f=-1;
    22         c=getchar();
    23     }
    24     while(isdigit(c)){
    25         t=(t<<3)+(t<<1)+c-'0';
    26         c=getchar();
    27     }
    28     return t*f;
    29 }
    30 const int maxn=5009;
    31 struct node{
    32     double x,y;
    33     inline void in(){
    34         x=readint();y=readint();
    35     }
    36 }x[maxn];
    37 double dis(int a,int b){
    38     return sqrt((x[a].x-x[b].x)*(x[a].x-x[b].x)+(x[a].y-x[b].y)*(x[a].y-x[b].y));
    39 }
    40 struct edge{
    41     int v;
    42     double w;
    43     inline edge(int V,double W){
    44         v=V;w=W;
    45     }    
    46     inline bool operator<(const edge A)const{
    47         return w>A.w;
    48     }
    49 };
    50 int n;
    51 double ans,d[maxn];
    52 bool p[maxn];
    53 priority_queue<edge>Q;
    54 void cal(){
    55     int cnt=0;
    56     rep(i,1,n) d[i]=1e10;d[1]=0;Q.push(edge(1,0));
    57     while(!Q.empty()){
    58         while(p[Q.top().v]) Q.pop();
    59         edge e=Q.top();Q.pop();
    60         cnt++;p[e.v]=1;ans+=e.w;
    61         if(cnt==n) break;
    62         rep(i,1,n) if(!p[i]){
    63             double tmp=dis(i,e.v);
    64             if(d[i]>tmp){
    65                 Q.push(edge(i,tmp));
    66                 d[i]=tmp;
    67             }
    68         }
    69     }
    70     printf("%.2lf
    ",ans);
    71 }
    72 int main(){
    73     //freopen("#input.txt","r",stdin);
    74     //freopen("#output.txt","w",stdout);
    75     n=readint();
    76     rep(i,1,n) x[i].in();
    77     cal();
    78     //fclose(stdin);
    79     //fclose(stdout);
    80     return 0;
    81 }
    View Code
  • 相关阅读:
    《Java并发编程实战》(五)---- 任务执行
    《Java并发编程实践》(四)---- 构建阻塞
    《Java并发编程实践》(三)---- 组合对象
    《Java8实战》(三)---- 重构测试和调试
    《Java核心技术》---- 多线程
    《Java并发编程实战》(二)---- 对象的共享
    《Java 8 实战》(三)---- 流
    《Java 8 实战》(二)—— Lambda
    《Java 8 实战》(一)——通过行为参数化传递代码
    Android_问卷调查
  • 原文地址:https://www.cnblogs.com/chensiang/p/7665853.html
Copyright © 2011-2022 走看看