HDU1879(最小生成树)
解题思路:题意明确,其实是最小生成树的一种变形,可以在读取输入时将已经建设的道路的费用看做是0,然后直接寻找最小生成树,得到生成树的耗费就是最短耗费。另外注意:用cin、cout输入输出则会超时,本来以为数据量不会太大,但改用scanf和printf后就AC了。
View Code
1 #include<stdio.h>
2 #define MAX 0xfffffff
3 #define max 105
4
5 int map[max][max],sign[max];
6 int main()
7 {
8 int n,a,b,c,d,i,j;
9 while(scanf("%d",&n)&&n)
10 {
11 for(i=1;i<=n;i++)
12 {
13 sign[i]=0;
14 for(j=1;j<=n;j++)
15 map[i][j]=MAX;
16 }
17 for(i=1;i<=n*(n-1)/2;i++)
18 {
19 scanf("%d%d%d%d",&a,&b,&c,&d);
20 if(d==1) map[a][b]=map[b][a]=0;
21 else map[a][b]=map[b][a]=c;
22 }
23 int sum=0,min,u;
24 for(i=1;i<=n;i++)
25 {
26 sign[1]=1;
27 min=MAX;
28 for(j=1;j<=n;j++)
29 if(!sign[j]&&min>map[1][j])
30 {
31 min=map[1][j];
32 u=j;
33 }
34 sign[u]=1;
35 if(min!=MAX) sum+=min;
36 for(j=1;j<=n;j++)
37 if(map[u][j]<map[1][j])
38 map[1][j]=map[u][j];
39 }
40 printf("%d\n",sum);
41 }
42 return 0;
43 }
2 #define MAX 0xfffffff
3 #define max 105
4
5 int map[max][max],sign[max];
6 int main()
7 {
8 int n,a,b,c,d,i,j;
9 while(scanf("%d",&n)&&n)
10 {
11 for(i=1;i<=n;i++)
12 {
13 sign[i]=0;
14 for(j=1;j<=n;j++)
15 map[i][j]=MAX;
16 }
17 for(i=1;i<=n*(n-1)/2;i++)
18 {
19 scanf("%d%d%d%d",&a,&b,&c,&d);
20 if(d==1) map[a][b]=map[b][a]=0;
21 else map[a][b]=map[b][a]=c;
22 }
23 int sum=0,min,u;
24 for(i=1;i<=n;i++)
25 {
26 sign[1]=1;
27 min=MAX;
28 for(j=1;j<=n;j++)
29 if(!sign[j]&&min>map[1][j])
30 {
31 min=map[1][j];
32 u=j;
33 }
34 sign[u]=1;
35 if(min!=MAX) sum+=min;
36 for(j=1;j<=n;j++)
37 if(map[u][j]<map[1][j])
38 map[1][j]=map[u][j];
39 }
40 printf("%d\n",sum);
41 }
42 return 0;
43 }