克鲁斯卡尔模版

来源:互联网 发布:小米聊天软件 编辑:程序博客网 时间:2024/04/28 04:16

这是一个基本的克鲁斯卡尔代码,我贴在这里,为了以后更好的学习微笑

代码如下:

#include<iostream>#include<cstring>#include<cstdio>#include<vector>#include<algorithm>using namespace std;const int maxn = 1001;int pre[maxn];struct Edge{      int u,v;      int cost;};bool operator < (const Edge &a,const Edge &b){      return a.cost<b.cost;}vector<Edge>edges;void add(int a,int b,int v){      Edge e;      e.u=a;      e.v=b;      e.cost=v;      edges.push_back(e);}int find(int a){      return a==pre[a]?a:pre[a]=find(pre[a]);}void merge(int a,int b){      int fa=find(a);      int fb=find(b);      if(fa!=fb)            pre[fa]=fb;}int Kruskal(int n){      int res=0,count=0;      sort(edges.begin(),edges.end());      for(int i=0;i<edges.size();i++){            Edge e=edges[i];            if(find(e.u)==find(e.v))continue;            merge(e.u,e.v);            res+=e.cost;            count++;      }      if(count!=n-1)return -1;      return res;}int main(){      int n,m;      while(cin>>n>>m){            edges.clear();            for(int i=1;i<=m;i++){                  pre[i]=i;                  int a,b,v;                  cin>>a>>b>>v;                  add(a,b,v);            }            int res=Kruskal(n);            if(res==-1)cout<<"no"<<endl;            else cout<<"yes"<<endl;      }      return 0;}


0 0
原创粉丝点击