不要想别的事情,在打代码的时候
#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;
}
长串代码更要注意易错点(就那么几个)
但是究竟是思维过载还是,单纯没注意到?还是二者兼有?这是个有待考察的问题
问题找到了,没有举反例,没有高清楚,以为明白了就算了