2 0 AC代码: #include<iostream> #include<cstdio> #include<string.h> #define MAX 999999; using namespace std; int map[105][105],dist[105]; bool isvisited[105]; int prim(int n) { int i,j,pos; int min,sum; sum=0; memset(isvisited,false,sizeof(isvisited)); //初始化 for(i=1; i<=n; i++) { dist[i]=map[1][i]; } //从1开始 isvisited[1]=true; dist[1]=MAX; //找到权值最小点并记录下位置 for(i=1; i<n; i++) { min=MAX; //pos=-1; 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,a,b; int c,d; while(~scanf("%d",&n)) { if(n==0) break; for(int i=0; i<(n*(n-1)/2); i++) { cin >> a>> b>>c>>d; if(d==1) map[a][b]=map[b][a]=0;//把已经修好的用零代替,这样既能不耽误最小树的寻找,又加不上其“代价” else map[a][b]=map[b][a]=c; } int ans=prim(n); printf("%d\n",ans); } return 0; } |