测试输入若干实例,每个测试实例第一行给出小熊的数目n和小熊们能直接通往的m条道路,(n,m < 100)接下来m行,每行为两只小熊的名字(分别为A,B,C.........,若n为3,则只会出现A,B,C,依次类推)以及这两只小熊之间的距离(为正整数)。 |
3 -1
AC 代码:
#include<iostream> #include<cstdio> #include<string.h> using namespace std; #define MAX 99999 #define LEN 101 int dist[LEN]; int map[LEN][LEN]; bool isvisited[LEN]; int m; void init()//这个函数是用来防止一点到另一点没路时 { int i,j; for(i=0; i<LEN; i++) { for(j=0; j<LEN; j++) { map[i][j]=MAX; } } } int prime(int n) { int i,j,min,pos,sum; sum=0; memset(isvisited,false,sizeof(isvisited)); for(i=1; i<=n; i++) { dist[i]=map[1][i]; } isvisited[1]=true; dist[1]=MAX; for(i=1; i<n; i++) { min=MAX; for(j=1; j<=n; j++) { if(!isvisited[j] && dist[j]<min) { min=dist[j]; pos=j; } } if(min==MAX)//最小的既然都达到这个程度了,就意味着这两点之间是不连着的 { return -1; } sum+=min; isvisited[pos]=true; for(j=1; j<=n; j++) { if(!isvisited[j] && dist[j]>map[pos][j]) { dist[j]=map[pos][j]; } } } return sum; } int main() { int n,m; while(~scanf("%d%d",&m,&n)) { init(); int i,a,b,w,ans; char c,d; if(n==0) break; for(i=0; i<n; i++) { cin>>c>>d>>w; a=c-'A'+1; b=d-'A'+1; if(map[a][b]>w) { map[a][b]=map[b][a]=w; } } ans=prime(m); cout<<ans<<endl; } return 0; }
|