标签:
Description
Input
Output
Sample Input
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0
Sample Output
216 30
用的prim算法
其中A的ASCII 码为65 减去64 即为1;
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int inf=1<<29; const int N=30; int w[N][N],flag[N],dis[N]; int n,c,s,z; int prim() { int sum=0; memset(flag,0,sizeof(flag)); for(int i=1; i<=n; i++) { dis[i]=w[1][i]; } flag[1]=1; for(int i=1; i<n; i++) { int to=-1,min1=inf; for(int j=1; j<=n; j++) { if(!flag[j]&&dis[j]<min1) { to=j; min1=dis[j]; } } if(to==-1) return -1; sum+=min1; flag[to]=1; for(int i=1; i<=n; i++) { dis[i]=min(dis[i],w[to][i]); } } return sum; } int main() { char a[2], b[2]; while(scanf("%d",&n)!=EOF&&n) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { w[i][j]=inf; } } for(int i=1; i<n; i++) { scanf("%s%d",a,&s); for(int j=1; j<=s; j++) { scanf("%s%d",b,&z); w[a[0]-64][b[0]-64]=w[b[0]-64][a[0]-64]=z; } } printf("%d\n",prim()); } return 0; }
标签:
原文地址:http://www.cnblogs.com/tianmin123/p/4766674.html