1.建边的时候起点终点之间的两层之间的路径为0,或者建边的时候两层图中间的起终点。 2. 要所有x值或y值相等的所有边都建上 不要这样
sort(a+1,a+tot+1,cmpx);
for(int i = 2 ; i<=tot ; i++){
if(a[i].x==a[i-1].x){
e[a[i].id].push_back(Edge{a[i-1].id,abs(a[i].y-a[i-1].y)*2});
e[a[i-1].id].push_back(Edge{a[i].id,abs(a[i-1].y-a[i].y)*2});
}
}
sort(a+1,a+tot+1,cmpy);
for(int i = 2 ; i<=tot ; i++){
if(a[i].y==a[i-1].y){
e[a[i].id+tot].push_back(Edge{a[i-1].id+tot,abs(a[i].x-a[i-1].x)*2});
e[a[i-1].id+tot].push_back(Edge{a[i].id+tot,abs(a[i-1].x-a[i].x)*2});
}
}
要这样
sort(a+1,a+tot+1,cmpx);
for(int i = 2 ; i<=tot ; i++){
int j = 1;
while(i-j>0&&a[i].x==a[i-j].x){
e[a[i].id].push_back(Edge{a[i-j].id,abs(a[i].y-a[i-j].y)*2});
e[a[i-j].id].push_back(Edge{a[i].id,abs(a[i-j].y-a[i].y)*2});
++j;
}
}
sort(a+1,a+tot+1,cmpy);
for(int i = 2 ; i<=tot ; i++){
int j = 1;
while(i-j>0&&a[i].y==a[i-j].y){
e[a[i].id+tot].push_back(Edge{a[i-j].id+tot,abs(a[i].x-a[i-j].x)*2});
e[a[i-j].id+tot].push_back(Edge{a[i].id+tot,abs(a[i-j].x-a[i].x)*2});
++j;
}
}