测试输入若干实例,每个测试实例第一行给出小熊的数目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; } 
 
 
 
 
 
  |