题目: http://poj.org/problem?id=1258
数据都过了,求解啊。
code:
1 #include <iostream> 2 using namespace std; 3 4 typedef struct node 5 { 6 int l; 7 int r; 8 int length; 9 struct node *next; 10 }Node,*LNode; // 定义结构体 11 void Init(LNode &L) // 初始化结构体 12 { 13 L=new Node; 14 L->next=NULL; 15 L->l=0; 16 L->r=0; 17 L->length=0; 18 } 19 //将权值 从小到大 插入链表。 20 void Create(LNode &L,int i,int j,int len) 21 { 22 Node *p,*g; 23 p=L->next; 24 g=L; 25 while(p) 26 { 27 if(len<p->length) 28 break; 29 g=p; 30 p=p->next; 31 } 32 Node *q; 33 q=new Node; 34 q->next=g->next; 35 q->length=len; 36 q->l=i; 37 q->r=j; 38 g->next=q; 39 } 40 /* 41 42 void print(LNode L) // 是否排序 43 { 44 Node *p; 45 p=L->next; 46 while(p) 47 { 48 cout<<p->length<<" "; 49 p=p->next; 50 } 51 cout<<endl; 52 }*/ 53 #define MAX 1000 54 int main() 55 { 56 LNode L; 57 58 // freopen("k.txt","r",stdin); 59 int set[MAX]; 60 int n,i,j,e; 61 while(cin>>n) 62 { 63 Init(L); 64 for(i=1;i<=n;i++) // 将数组初始化 65 set[i]=i; 66 for(i=1;i<=n;i++) 67 for(j=1;j<=n;j++) 68 { 69 cin>>e; 70 if(e && i>j) //下三角形不为0时按顺序插入链表中 71 { 72 Create(L,i,j,e); 73 } 74 } 75 // print(L); 76 int sum=0; // 边的总和 77 Node *p; 78 p=L->next; 79 int v=0; //边数 80 while(p) 81 { 82 int t1=p->l,t2=p->r; 83 if(set[t1]!=set[t2]) 84 { 85 for(i=1;i<=n;i++) //将数组里为set[t2]的值时,全部改为set[t1]; 86 if(set[i]==set[t2]) 87 set[i]=set[t1]; 88 set[t2]=set[t1]; 89 sum+=p->length; 90 v++; 91 if(v==n-1) 92 break; 93 } 94 p= p->next; 95 } 96 cout<<sum<<endl; 97 98 } 99 100 return 0; 101 }