编程事情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;
}

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

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

问题找到了,没有举反例,没有高清楚,以为明白了就算了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值