道路建设 (Ver. I)

题目描述

有N个村庄,编号从1到N,你应该建造一些道路,使每个村庄都可以相互连接。

两个村A和B是相连的,当且仅当A和B之间有一条道路,或者存在一个村C使得在A和C之间有一条道路,并且C和B相连。

现在一些村庄之间已经有一些道路,你的任务就是修建一些道路,使所有村庄都连通起来,并且所有道路的长度总和是最小的。

输入

测试数据有多组

第一行是整数N(3 <= N <= 100),代表村庄的数量。 然后是N行,其中第i行包含N个整数,这些N个整数中的第j个是村庄i和村庄j之间的距离(距离是[1,1000]内的整数)。

然后是整数Q(0 <= Q <= N *(N + 1)/ 2),接下来是Q行,每行包含两个整数a和b(1 <= a

输出

对于每组测试数据

输出一个整数,表示要构建的道路的长度总和最小值

样例输入

3

0 990 692

990 0 179

692 179 0

1

1 2

样例输出

179

#include
using namespace std;
const int maxx= 6000;

  

class Kru{//存储kruskal算法中的节点
    public:
    int bef; 
    int aft;
    int data;
    int flag;
    Kru(){
        bef= -1;
        aft= -1;
        data= 0;
        flag= 0;
    }
};

 

void change(int visit[], int n, int a, int b){//将两个顶点及与他们相通的顶点改成同样的值表示 
                                              //他们相通
    for(int i= 0; i< n; i++)
      if(visit[i]== a)
        visit[i]= b;
 
}

int findmin(int visit[], Kru kr[], int in){//找出kr[]数组中权重最小的边
    int minn= 10000;
    int index= 0;
    int flag= 0;
     for(int i= 0; i< in; i++){
     	if(visit[kr[i].bef]== visit[kr[i].aft])
     	  kr[i].flag= 1;
        if(!kr[i].flag&&kr[i].data< minn){//如果该边没被访问且最小
            minn= kr[i].data;
            index= i;
            flag= 1;
         }
     }
      
 
     return index;
 
}

int kruskal(int visit[], int in, int n, Kru kr[]){//kruskal算法

     
     int k= 0;
     int result= 0;
     while(true){
        int minn= findmin(visit, kr, in);//找出权重最小的边

         kr[minn].flag= 1;
         int t1= kr[minn].bef;
         int t2= kr[minn].aft;
          
      
        if(visit[t1]!= visit[t2]){//如果两个顶点的visit值不一样说明还没相通
         
            change(visit, n, visit[t1], visit[t2]);//将两个顶点连通
            result+= kr[minn].data;
         }
         k++;
         if(k> in)
         break;
     } 
     return result;
}
int main(){
	int n;
	while(cin>>n){
	     int visit[n+ 5];
	      Kru kr[maxx+ 5];
	    for(int i= 0; i< n; i++)
          visit[i]= i;//初始visit[]数组
          
          
		int k= 0;
		for(int i= 0; i< n; i++)
		  for(int j= 0; j< n; j++){
		  	int temp;
		  	cin>>temp;
		  	 if(i< j){
		  	 	kr[k].bef= i;
		  	 	kr[k].aft= j;
		  	 	kr[k++].data= temp;
			   }
		  }
		  
		  int h;
		  cin>>h;
		  while(h--){
		  	int a, b;
		  	cin>>a>>b;
		  
           change(visit, n, visit[a-1], visit[b- 1]);

		  }
		  cout<

 下面附上测试样例:

7
0 303 274 277 227 892 894
303 0 56 749 227 554 885
274 56 0 774 315 442 451
277 749 774 0 23 912 299
227 227 315 23 0 607 193
892 554 442 912 607 0 863
894 885 451 299 193 863 0
14
3 6
5 1
2 1
2 4
1 2
1 5
1 4
4 5
4 6
3 4
4 5
3 7
5 6
7 5
3
0 564 574
564 0 831
574 831 0
4
1 3
3 1
2 3
3 2
9
0 145 680 773 147 262 485 54 80
145 0 674 627 340 313 222 510 603
680 674 0 424 225 107 339 150 937
773 627 424 0 28 562 579 110 40
147 340 225 28 0 538 804 237 736
262 313 107 562 538 0 90 381 415
485 222 339 579 804 90 0 863 879
54 510 150 110 237 381 863 0 677
80 603 937 40 736 415 879 677 0
24
9 2
1 7
6 1
6 5
8 1
7 5
1 3
3 7
3 6
5 6
2 4
3 2
2 8
8 3
1 2
3 1
2 9
6 1
3 8
8 2
3 4
2 6
4 6
8 9
6
0 688 644 964 910 232
688 0 646 513 883 542
644 646 0 347 913 137
964 513 347 0 112 699
910 883 913 112 0 807
232 542 137 699 807 0
17
4 2
6 2
4 3
6 3
5 3
2 6
5 1
1 2
2 6
5 2
4 1
3 4
2 3
2 1
4 2
6 4
3 4
6
0 657 868 964 723 979
657 0 346 511 777 724
868 346 0 615 188 334
964 511 615 0 365 112
723 777 188 365 0 177
979 724 334 112 177 0
10
2 1
1 2
6 2
3 1
1 4
1 2
1 6
4 6
5 2
4 3
7
0 228 352 995 416 685 711
228 0 527 862 718 261 146
352 527 0 504 727 237 228
995 862 504 0 64 66 754
416 718 727 64 0 919 159
685 261 237 66 919 0 295
711 146 228 754 159 295 0
26
3 4
1 3
1 5
3 4
6 4
2 7
4 1
7 5
6 2
1 2
2 1
7 5
1 4
7 3
4 2
3 5
2 1
5 6
1 2
5 1
6 1
6 5
3 2
5 1
3 6
2 3
9
0 241 10 49 895 542 841 163 223
241 0 167 623 217 127 255 610 300
10 167 0 59 691 102 70 875 59
49 623 59 0 151 879 487 150 208
895 217 691 151 0 409 600 791 591
542 127 102 879 409 0 622 383 601
841 255 70 487 600 622 0 670 630
163 610 875 150 791 383 670 0 142
223 300 59 208 591 601 630 142 0
10
2 9
4 5
8 9
3 7
2 8
7 2
9 6
3 9
4 8
6 9
8
0 507 724 124 107 393 105 600
507 0 255 249 316 282 15 248
724 255 0 140 35 141 297 466
124 249 140 0 76 555 966 885
107 316 35 76 0 576 968 924
393 282 141 555 576 0 84 119
105 15 297 966 968 84 0 523
600 248 466 885 924 119 523 0
7
5 8
1 8
3 8
4 3
6 4
6 8
2 5
5
0 492 969 11 957
492 0 44 917 274
969 44 0 928 493
11 917 928 0 241
957 274 493 241 0
13
1 5
4 1
5 1
1 4
5 4
2 4
2 3
3 2
5 4
1 3
2 1
5 2
5 4
5
0 488 209 194 198
488 0 285 119 481
209 285 0 625 549
194 119 625 0 58
198 481 549 58 0
3
1 4
3 5
2 4
3
0 907 807
907 0 121
807 121 0
3
3 2
1 3
1 3
5
0 249 673 815 368
249 0 505 439 268
673 505 0 563 493
815 439 563 0 913
368 268 493 913 0
10
3 2
2 3
3 2
1 3
1 4
1 3
2 4
5 2
1 5
1 4
9
0 525 30 922 87 522 835 324 990
525 0 51 385 796 810 109 763 475
30 51 0 639 202 731 833 382 655
922 385 639 0 816 903 549 854 898
87 796 202 816 0 973 789 918 563
522 810 731 903 973 0 443 795 592
835 109 833 549 789 443 0 717 233
324 763 382 854 918 795 717 0 114
990 475 655 898 563 592 233 114 0
36
9 5
6 3
9 3
6 8
8 2
4 2
3 4
5 7
4 6
7 9
7 4
2 1
1 8
9 2
5 6
1 5
8 4
7 6
4 1
4 1
2 6
2 4
9 5
1 3
1 6
2 8
9 1
6 9
6 5
9 2
9 7
4 5
2 1
1 5
1 5
5 3
4
0 25 587 458
25 0 115 641
587 115 0 810
458 641 810 0
4
2 3
1 3
4 2
1 4
10
0 900 303 952 303 306 737 929 818 572
900 0 436 76 143 445 452 81 902 566
303 436 0 73 711 641 714 673 522 740
952 76 73 0 860 21 330 137 137 729
303 143 711 860 0 248 388 31 200 43
306 445 641 21 248 0 336 288 971 154
737 452 714 330 388 336 0 859 406 581
929 81 673 137 31 288 859 0 353 202
818 902 522 137 200 971 406 353 0 32
572 566 740 729 43 154 581 202 32 0
39
3 9
6 5
9 10
9 2
1 3
10 7
1 9
4 9
1 5
1 9
3 1
2 1
8 4
6 9
7 9
3 5
4 9
5 9
9 6
9 3
7 5
3 7
1 3
8 5
3 8
9 5
9 2
4 7
4 10
5 6
6 10
6 10
5 8
2 3
10 8
10 5
7 2
7 6
8 2
5
0 117 38 723 168
117 0 762 446 404
38 762 0 165 427
723 446 165 0 610
168 404 427 610 0
8
2 4
3 5
4 3
1 4
4 1
5 3
4 1
2 4
4
0 668 11 886
668 0 705 85
11 705 0 405
886 85 405 0
8
2 4
3 4
1 4
2 3
2 3
2 3
3 1
2 1
10
0 262 178 59 624 416 116 708 820 933
262 0 589 332 267 544 452 303 112 863
178 589 0 229 274 589 70 917 362 739
59 332 229 0 775 912 627 940 685 35
624 267 274 775 0 332 946 564 742 921
416 544 589 912 332 0 979 857 628 151
116 452 70 627 946 979 0 790 216 834
708 303 917 940 564 857 790 0 56 111
820 112 362 685 742 628 216 56 0 285
933 863 739 35 921 151 834 111 285 0
41
4 10
9 7
8 10
5 1
8 9
2 4
1 6
10 2
3 5
3 4
2 6
1 7
1 8
9 5
8 2
4 8
8 3
7 3
3 6
3 4
9 3
1 10
6 3
5 1
7 10
2 8
7 4
6 7
1 4
1 5
7 10
5 1
7 9
6 4
1 9
3 4
2 4
1 6
8 1
3 9
2 10
3
0 175 38
175 0 681
38 681 0
2
3 1
3 1
9
0 642 952 67 520 657 41 792 138
642 0 555 287 789 718 868 654 908
952 555 0 138 698 126 912 160 231
67 287 138 0 438 197 911 727 429
520 789 698 438 0 494 146 346 805
657 718 126 197 494 0 705 339 757
41 868 912 911 146 705 0 771 210
792 654 160 727 346 339 771 0 413
138 908 231 429 805 757 210 413 0
33
6 8
8 1
6 7
6 8
9 8
7 5
3 7
4 7
3 2
2 1
7 2
8 7
9 1
7 2
9 5
3 6
4 9
8 7
5 7
5 3
2 5
9 4
3 1
5 2
1 9
3 6
6 3
4 1
2 4
8 6
6 4
7 3
5 8
20
0 432 95 844 368 566 520 352 489 507 759 940 298 438 321 699 94 617 168 849
432 0 743 767 866 348 749 860 774 508 971 881 738 538 313 184 381 680 749 252
95 743 0 31 238 758 141 529 408 930 849 458 24 818 625 872 560 392 737 259
844 767 31 0 492 949 385 351 919 617 88 456 929 271 189 960 372 440 342 609
368 866 238 492 0 550 482 137 957 412 338 414 787 507 390 10 418 133 747 677
566 348 758 949 550 0 625 47 413 327 965 29 415 772 310 37 960 269 408 400
520 749 141 385 482 625 0 963 16 301 444 505 257 207 194 22 345 700 411 355
352 860 529 351 137 47 963 0 117 544 453 145 520 499 909 846 463 290 612 234
489 774 408 919 957 413 16 117 0 599 649 546 219 56 297 181 424 597 977 280
507 508 930 617 412 327 301 544 599 0 205 535 473 226 880 524 988 586 640 883
759 971 849 88 338 965 444 453 649 205 0 38 137 402 536 397 600 350 686 211
940 881 458 456 414 29 505 145 546 535 38 0 935 636 211 480 855 267 776 387
298 738 24 929 787 415 257 520 219 473 137 935 0 690 372 363 969 576 250 793
438 538 818 271 507 772 207 499 56 226 402 636 690 0 153 481 316 493 66 307
321 313 625 189 390 310 194 909 297 880 536 211 372 153 0 375 103 795 129 990
699 184 872 960 10 37 22 846 181 524 397 480 363 481 375 0 192 728 691 877
94 381 560 372 418 960 345 463 424 988 600 855 969 316 103 192 0 290 625 513
617 680 392 440 133 269 700 290 597 586 350 267 576 493 795 728 290 0 501 105
168 749 737 342 747 408 411 612 977 640 686 776 250 66 129 691 625 501 0 719
849 252 259 609 677 400 355 234 280 883 211 387 793 307 990 877 513 105 719 0
149
12 5
20 16
20 8
3 1
12 16
1 7
8 6
5 14
20 2
9 11
9 11
19 11
15 3
11 1
9 3
18 8
18 9
7 20
9 18
7 9
16 6
6 20
20 5
11 1
5 1
2 15
20 12
9 2
14 12
15 2
14 4
1 3
12 19
14 20
8 13
20 3
18 5
14 9
9 5
2 5
17 15
11 8
6 11
2 11
2 16
4 15
11 4
9 2
2 3
13 9
7 12
3 16
16 8
5 16
12 18
12 1
12 2
8 9
12 1
19 14
16 2
20 18
5 9
19 18
3 11
18 1
2 12
16 9
19 20
4 3
17 15
3 20
8 2
8 20
3 6
13 10
7 4
8 3
4 18
12 6
9 18
2 12
14 11
11 5
6 13
2 13
7 1
20 1
19 2
6 3
4 13
7 11
7 2
8 19
20 8
19 17
10 11
10 12
1 15
9 5
8 1
3 20
13 2
20 3
16 6
18 19
10 16
1 16
17 20
6 16
8 5
13 9
7 2
12 7
8 20
3 15
13 17
15 5
18 14
19 13
11 16
3 20
11 3
8 15
13 3
2 9
15 2
15 9
13 16
12 15
11 4
11 17
20 1
2 19
5 14
8 4
5 2
3 4
8 6
9 16
13 2
11 13
14 3
8 18
10 1
12 18
1 12
20 11
9 4
18
0 88 139 280 61 54 763 209 201 901 9 596 385 711 358 357 176 93
88 0 916 473 142 278 134 553 755 266 437 106 928 497 601 891 584 92
139 916 0 523 644 145 285 852 697 537 213 644 273 923 2 981 450 94
280 473 523 0 897 923 587 526 408 491 280 25 927 738 952 775 690 842
61 142 644 897 0 358 781 364 354 277 1 557 973 889 769 617 162 43
54 278 145 923 358 0 970 142 493 63 390 415 1 915 822 491 547 846
763 134 285 587 781 970 0 770 636 797 544 325 990 902 106 706 255 734
209 553 852 526 364 142 770 0 58 811 707 298 932 675 811 974 996 305
201 755 697 408 354 493 636 58 0 466 410 694 232 410 961 53 900 859
901 266 537 491 277 63 797 811 466 0 250 669 494 398 565 818 740 466
9 437 213 280 1 390 544 707 410 250 0 275 797 72 9 854 234 715
596 106 644 25 557 415 325 298 694 669 275 0 503 165 741 314 139 736
385 928 273 927 973 1 990 932 232 494 797 503 0 618 956 497 663 188
711 497 923 738 889 915 902 675 410 398 72 165 618 0 906 623 592 805
358 601 2 952 769 822 106 811 961 565 9 741 956 906 0 481 842 826
357 891 981 775 617 491 706 974 53 818 854 314 497 623 481 0 974 591
176 584 450 690 162 547 255 996 900 740 234 139 663 592 842 974 0 390
93 92 94 842 43 846 734 305 859 466 715 736 188 805 826 591 390 0
72
8 15
10 16
2 7
11 6
12 6
14 1
8 9
10 3
11 10
2 14
9 14
9 7
15 14
9 15
5 8
3 1
17 12
14 1
17 4
6 10
9 18
10 14
6 1
15 17
8 14
12 16
9 18
3 11
11 18
15 18
2 13
16 11
8 16
9 10
2 18
16 1
7 12
6 5
8 2
13 3
12 8
10 11
10 2
18 9
16 17
8 9
15 1
16 10
9 5
11 7
3 9
13 14
15 18
1 16
10 1
9 17
10 18
7 18
1 6
6 14
5 14
4 17
12 18
6 18
2 15
4 5
17 15
17 14
13 3
14 1
17 3
16 5
上面测试样例对应的结果:

0
0
0
0
0
0
10
15
0
58
0
0
0
0
0
0
0
0
175
0
0
0
 

 

你可能感兴趣的:(C++)