hdu1301 最小生成树

来源:互联网 发布:新浪php笔试题 编辑:程序博客网 时间:2024/05/29 07:53

题意:输入n个城是,下面n-1行,第一个字母是那个城市的标号,第二个数字是 表示后面有多少条与之相连的边,后面是与之相连的城市的编号加上他的权值。

思路:这个题好多英文,英语不好,用了下百度翻译,对着输入图大概看懂了题意。直接map建图然后克鲁斯卡尔就行

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<vector>#include<string>#include<map>using namespace std;struct edge{int from,to,w;};map<string,int>mm;int n,m;vector<edge>edges;int pre[50];bool cmp(edge a,edge b){    return a.w<b.w;}void addedge(int x,int y,int w){    edge v={x,y,w};    edges.push_back(v);}int find(int x){    if(pre[x]==x)    {        return x;    }    else    {        pre[x]=find(pre[x]);        return pre[x];    }}void kluska(){    for(int i=1;i<=n;i++)    {        pre[i]=i;    }    int sum=0;    int top=n;    for(int i=0;i<edges.size();i++)    {        int f1=find(edges[i].from);        int f2=find(edges[i].to);        if(f1!=f2)        {            pre[f2]=f1;            sum+=edges[i].w;            top--;            if(top==1) break;        }    }    printf("%d\n",sum);}int main(){   while(scanf("%d",&n)&&n)   {      mm.clear();      edges.clear();      char b[81];      char a[81];      int cnt=1;      for(int i=1;i<n;i++)      {          scanf("%s",b);          if(!mm[b]) mm[b]=cnt++;          int q;          scanf("%d",&q);          for(int i=1;i<=q;i++)          {              scanf("%s",a);              if(!mm[a]) mm[a]=cnt++;              int w;              scanf("%d",&w);              addedge(mm[b],mm[a],w);          }       }     /*  for(int i=0;i<edges.size();i++)       {           printf("%d %d %d\n",edges[i].from,edges[i].to,edges[i].w);       }*/       sort(edges.begin(),edges.end(),cmp);       kluska();   }}



原创粉丝点击