1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
   | #include<bits/stdc++.h>
  #define INF 0x3f3f3f3f
  using namespace std;
  int mp[30][30],dis[30]; int vis[30],n;
  void init() { 	for(int i=1;i<=n;i++) 	{ 		for(int j=1;j<=n;j++) 		{ 			if(i==j)	mp[i][j]=0; 			else 				mp[i][j]=INF; 		} 	} };
  int find(int n) { 	memset(vis, 0, sizeof(vis)); 	int mi,pos,sum=0; 	for(int i=1;i<=n;i++)	dis[i]=mp[1][i]; 	vis[1]=1; 	for(int i=1;i<n;i++) 	{ 		mi=INF; 		int flag=0; 		for(int j=1;j<=n;j++) 		{ 			if(!vis[j]&&dis[j]<mi) 			{ 				mi=dis[j]; 				pos=j; 				flag=1; 			} 		} 		if(!flag)	return -1; 		sum+=mi; 		vis[pos]=1; 		for(int j=1;j<=n;j++) 		{ 			if(!vis[j]&&dis[j]>mp[pos][j]) 			{ 				dis[j]=mp[pos][j]; 			} 		} 	} 	return sum; }
  int main() { 	int m,l; 	string a,b; 	while(cin>>n>>m) 	{ 		init(); 		for(int i=0;i<m;i++) 		{ 			cin>>a>>b>>l; 			int x=a[0]-'A'+1; 			int y=b[0]-'A'+1; 			mp[x][y]=mp[y][x]=l; 		} 		int ans=find(n); 		cout<<ans<<endl; 	} 	return 0; }
 
  |