题意:
有n个点 每个点上有一些道路 求最小生成树
解释下输入格式
A n v1 w1 v2 w2
A点上有n条边 A到v1权值是w1 A到v2权值是w2
思路:
字符串处理之后跑kruskal求最小生成树
1 /* *********************************************** 2 Author :Sun Yuefeng 3 Created Time :2016/11/9 18:26:37 4 File Name :tree.cpp 5 ************************************************ */ 6 7 #include<cstdio> 8 #include<iostream> 9 #include<algorithm> 10 #include<cmath> 11 #include<cstring> 12 #include<string> 13 #include<bitset> 14 #include<map> 15 #include<set> 16 #include<stack> 17 #include<vector> 18 #include<queue> 19 #include<list> 20 #define M(a,b) memset(a,b,sizeof(a)) 21 using namespace std; 22 typedef long long ll; 23 const int inf=0x3f3f3f3f; 24 const int maxn=30; 25 const int maxm=80; 26 const int mod=1e7+7; 27 int dx[8]= {0,0,1,-1,1,-1,1,-1}; 28 int dy[8]= {1,-1,0,0,-1,1,1,-1}; 29 30 int f[maxn],tol,n; 31 32 struct _edge 33 { 34 int u,v,w; 35 friend bool operator < (const _edge a,const _edge b) 36 { 37 return a.w<b.w; 38 } 39 }edge[maxm]; 40 41 void addedge(int u,int v,int w) //加边 42 { 43 edge[tol].u=u; 44 edge[tol].v=v; 45 edge[tol].w=w; 46 tol++; 47 } 48 49 int _find(int x) //并查集 50 { 51 if(f[x]==-1) return x; 52 else return f[x]=_find(f[x]); 53 } 54 55 int kruskal() 56 { 57 M(f,-1); 58 sort(edge,edge+tol); //把所有的边排序 59 int cnt=0,ans=0; 60 int u,v,w,f1,f2; 61 for(int i=0;i<tol;i++) //从权值最小的边开始加 62 { 63 u=edge[i].u; 64 v=edge[i].v; 65 w=edge[i].w; 66 f1=_find(u); 67 f2=_find(v); 68 if(f1!=f2) //判断是否成环 69 { 70 ans+=w; 71 f[f1]=f2; 72 cnt++; 73 } 74 if(cnt==n-1) break; 75 } 76 //if(cnt<n-1) return -1; 判断图是否连通 77 return ans; 78 } 79 80 int main() 81 { 82 //freopen("in.txt","r",stdin); 83 //freopen("out.txt","w",stdout); 84 while(scanf("%d",&n)!=EOF&&n) 85 { 86 tol=0; 87 for(int i=0;i<n-1;i++) 88 { 89 char str[2]; 90 int num,u,v,w; 91 scanf("%s",str); 92 u=str[0]-'A'; 93 scanf("%d",&num); 94 while(num--) 95 { 96 scanf("%s",str); 97 v=str[0]-'A'; 98 scanf("%d",&w); 99 addedge(u,v,w); 100 } 101 } 102 printf("%d ",kruskal()); 103 } 104 return 0; 105 } 106 /* 107 108 9 109 A 2 B 12 I 25 110 B 3 C 10 H 40 I 8 111 C 2 D 18 G 55 112 D 1 E 44 113 E 2 F 60 G 38 114 F 0 115 G 1 H 35 116 H 1 I 35 117 3 118 A 2 B 10 C 40 119 B 1 C 20 120 0 121 122 */