自学内容网 自学内容网

编程事情1

不要想别的事情,在打代码的时候

#include<stdio.h>                      
int h[7],pos[7],dis[7];
int size,book[7] = {0};              //注意变量的取值范围!代码可以写得笨一点 
                                     //举例子,抽象关系容易错 
void swap(int i,int j){              //要仔细,不要最后几个就大意 
int t;                           //搞清楚符号的意义 可以记住画图 
t = h[i];                        //特殊情况要注意 for(i = 1;i <= n;i ++) dis[1] = 0;
    dis[i] = inf;                   // 看看有没有再用到,要不要特殊处理 
h[i] = h[j];
h[j] = t;

t = pos[h[i]];
pos[h[i]] = pos[h[j]];
pos[h[j]] = t;

return;
}

void shiftdown(int i){
int t;
int flag = 0;
while(flag == 0 && i <= size / 2){

if(dis[h[i]] > dis[h[2 * i]])
   t = 2 * i;
else 
   t = i;
   
//if(dis[h[t]] > dis[h[2 * i + 1]] && 2 * i + 1 <= size)
if(dis[h[t]] > dis[h[2 * i + 1]])   //没有 2 * i + 1 <= size
   t = 2 * i + 1;

if(i != t){
swap(i,t);
i = t;
}
else 
  flag = 1;
  
}

return;

}

void shiftup(int i){
int t;

if(i == 1)
   return;

while(i > 1){

//if(dis[h[i / 2]] > dis[h[i]]) //没举例子,把这些个错搞成了父节点当作了h * 2 
//t =  i / 2;
if(dis[h[i / 2 * 2 * 2]] > dis[h[i]])  
   t =  i / 2 * 2 * 2;    //i / 2 * 2 * 2   i / 2 * 2
else
  t = i;
  
if(t != i){
swap(i,t);
i = t;
  }
else 
   break;
   
}

return;

}

int pop(){
int t;
t = h[1];
h[1] = h[size];
h[size] = t;
pos[h[1]] = 1;
pos[h[size]] = size;
size --;
shiftdown(1);
return t;
}

int main(){
int n,m,inf = 99999999;
int i,count = 0,sum = 0;
int t1,t2,t3;
int u[19],v[19],w[19],first[7],next[19];

scanf("%d %d",&n,&m);

for(i = 1;i <= n;i ++)
    book[n] = 0;

size = n;

for(i = 1;i <= n;i ++)
    dis[i] = inf;
dis[1] = 0;
    
for(i = 1;i <= n;i ++)
    first[i] = -1;
    
    for(i = 1;i <= n;i ++){
    h[i] = i;
    pos[i] = i;
}

for(i = 1;i <= m;i ++){
scanf("%d %d %d",&u[i],&v[i],&w[i]);
next[i] = first[u[i]];
first[u[i]] = i;
}
for(i = m + 1;i <= 2 * m;i ++){
u[i] = v[i - m];
v[i] = u[i - m];
w[i] = w[i - m];
next[i] = first[u[i]];
first[u[i]] = i;
}

int k = first[1];
while(k != -1){
   if(dis[v[k]] > w[k] && book[1] == 0){
     dis[v[k]] = w[k];
     shiftup(v[k]); 
   } 
  k = next[k];
}
book[1] = 1;
count ++;

for(i = 1;i <= n;i ++)
    printf("%d ",dis[i]);
printf("\n");

//for(i = n;i < 1;i --){    //没考虑dis【1】 == 0 
//shiftup(i);
//}

int hd = pop();  //不能和数组同字 NO use h
printf("first pop is %d\n",hd);

for(i = 1;i <= n;i ++)
printf("h[%d] = %d ",i,h[i]);
printf("\n");

while(count < n){

int j = pop();
    printf("pop is %d\n",j);
    
    for(i = 1;i <= n;i ++)
    printf("h[%d] = %d ",i,h[i]);
printf("\n");

sum += dis[j];
book[j] = 1;
count ++;

k = first[j];
while(k != - 1){
   //if(dis[v[k]] > w[k] && book[v[k]] == 0){  //写成了 book[k]
   if(dis[v[k]] > w[k] && book[k] == 0){
     dis[v[k]] = w[k];                //这里某个关系错误 
     shiftup(v[k]);
   }
k = next[k];
}
for(i = 1;i <= n;i ++)
    printf("%d ",dis[i]);
printf("\n");
}

printf("%d\n",sum);

return 0;
}

长串代码更要注意易错点(就那么几个)

但是究竟是思维过载还是,单纯没注意到?还是二者兼有?这是个有待考察的问题

 


原文地址:https://blog.csdn.net/2301_80124936/article/details/142368242

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!