数据结构总结之最小生成树

来源:互联网 发布:手机上编写c语言的软件 编辑:程序博客网 时间:2024/06/06 06:19

1.kruskal:

#include <stdio.h>#include <stdlib.h>#include <algorithm>#define N 150using namespace std;int m,n,u[N],v[N],w[N],p[N],r[N];//r是边的编号//p是点的祖先点(便于判断是否在同一连通图)int cmp(const int i,const int j){    return w[i]<w[j];}int find(int x){    return p[x]==x?x:p[x]=find(p[x]);}int kruskal(){    int cou=0,x,y,i,ans=0;    for(i=0; i<n; i++) p[i]=i;    for(i=0; i<m; i++) r[i]=i;    sort(r,r+m,cmp);    for(i=0; i<m; i++)    {        int e=r[i];        x=find(u[e]);        y=find(v[e]);        if(x!=y)        {            ans += w[e];            p[x]=y;            cou++;        }    }    if(cou<n-1) ans=0;    return ans;}int main(){    int i,ans;    while(scanf("%d%d",&m,&n)!=EOF&&m)    {        for(i=0; i<m; i++)        {            scanf("%d%d%d",&u[i],&v[i],&w[i]);        }        ans=kruskal();        if(ans) printf("%d\n",ans);        else printf("?\n",ans);    }    return 0;}

2.遍历所有节点,求最小的路径最大值:
uva544
prim:

#include <iostream>#include <stdio.h>#include <string.h>#include <string>#include <map>#include <algorithm>using namespace std;int m,n,t;int e,b;int map_ [210][210];bool vis[210];int dis[210];map <string,int> ma;void dj(){   for(int i=1;i<=n;i++) dis[i]=map_[b][i];   dis[b]=0;   vis[b]=1;   for(int i=0;i<n;i++)   {       int temp=-1;       int v=-1;       for(int j=1;j<=n;j++)       {           if(temp<dis[j] && !vis[j])           {               temp=dis[j];               v=j;           }       }       if(v==-1) return ;       vis[v]=1;       for(int j=1;j<=n;j++)        if(!vis[j] && map_[v][j] && dis[j]<min(dis[v],map_[v][j]))            dis[j]=min(dis[v],map_[v][j]);   }}int main(){    int count_=0;    while(cin>>n>>m && !(n==0 && m==0))    {        t=1;        count_++;        ma.clear();        memset(map_,0,sizeof(map_));        memset(vis,0,sizeof(vis));        for(int i=0;i<m;i++)            {                string s1,s2;                int ton;                cin>>s1;                if(!ma.count(s1))                ma[s1]=t++;                cin>>s2;                if(!ma.count(s2))                    ma[s2]=t++;                cin>>ton;                int x=ma[s1];                int y=ma[s2];                map_[x][y]=ton;                map_[y][x]=ton;            }        string s1,s2;        cin>>s1>>s2;        b=ma[s1];        e=ma[s2];        dj();        cout<<"Scenario #"<<count_<<endl<<dis[e]<<" tons"<<endl<<endl;    }    return 0;}

kruskal:

#include <cstdio>  #include <cstring>  #include <string>  #include <map>  #include <iostream>  #include <algorithm>  using namespace std;  const int N = 205;  const int M = 20005;  map<string, int> hash;  string a, b;  int hn;  int get(string a) {      if (!hash.count(a)) hash[a] = hn++;      return hash[a];  }  struct Edge {      int u, v, val;      void read() {          cin >> a >> b >> val;          u = get(a); v = get(b);      }  } e[M];  bool cmp(Edge a, Edge b) {      return a.val > b.val;  }  int n, m, parent[N];  int find(int x) {      return x == parent[x] ? x : parent[x] = find(parent[x]);  }  int main() {      int cas = 0;      while (~scanf("%d%d", &n, &m) && n || m) {          string a, b, val;          hash.clear(); hn = 1;          for (int i = 1; i <= n; i++) parent[i] = i;          for (int i = 0; i < m; i++) e[i].read();          sort(e, e + m, cmp);          cin >> a >> b;          int ss = get(a), ee = get(b);          for (int i = 0; i < m; i++) {              int pu = find(e[i].u);              int pv = find(e[i].v);              if (pu != pv) {                  parent[pu] = pv;                  if (find(ss) == find(ee)) {                      printf("Scenario #%d\n", ++cas);                      printf("%d tons\n\n", e[i].val);                      break;                  }              }          }      }      return 0;  } 
原创粉丝点击