HDU 1879 还是prim最小生成树、

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<string.h>
 4 const int qq=100+10,MAX=1e7;
 5 int vis[qq];
 6 int lowcost[qq][qq];
 7 int minimum[qq];
 8 int n;
 9 void prim()
10 {
11             int minx,k;
12             int sum=0;
13             vis[1]=1;
14             for(int i=0;i<=n+1;++i)
15                 minimum[i]=lowcost[1][i];
16             for(int i=1;i<n;++i){
17                 minx=MAX;
18                 for(int j=1;j<=n;++j)
19                     if(!vis[j] && minx > minimum[j]){
20                         minx=minimum[j];
21                         k=j;
22                     }
23                 vis[k]=1;
24                 sum+=minx;
25                 for(int l=1;l<=n;++l)
26                     if(!vis[l] && minimum[l] > lowcost[k][l])
27                         minimum[l]=lowcost[k][l];
28             }
29             printf("%d\n",sum);
30 }
31 int main()
32 {
33     while(~scanf("%d",&n)&&n){
34         for(int i=0;i<=n+1;++i)
35             minimum[i]=MAX;
36         for(int j,i=0;i<=n+1;++i)
37             for(j=0;j<=n+1;++j)
38                 lowcost[i][j]=MAX;
39         for(int i=0;i<=n+1;++i)
40             vis[i]=0;
41         int i,j,cost,mark;
42         for(int l=1;l<=n*(n-1)/2;++l){
43             scanf("%d %d %d %d",&i,&j,&cost,&mark);
44             if(mark==1){
45                 lowcost[i][j]=lowcost[j][i]=0;            //已经存在路径的话直接权值为0 
46             }
47             else
48                 lowcost[i][j]=lowcost[j][i]=(i==j)?0:cost;
49         }
50         prim();
51     }
52 } 

 

最开始调试的时候好像memset函数使用错误,我把第二个参数写的MAX开始RE或者PE, 最后迫于无奈,直接用循环来初始化

后来标记已经存在的路径vis分别标记i,j为1;这样我就分了三种情况讨论第一是已经标记过的点位0个,第二是已经标记过的点位n个,0~n之间就是第三种情况,调了半天发现WA了几次、最后还是直接套用prim算法来的准确,所以就说已存在路径的值直接赋值0好了

posted @ 2016-02-27 20:01  我不萌、我要高冷  阅读(193)  评论(0编辑  收藏  举报