soj4542 二基楼的迷宫 最短路+spfa
2017-03-31 01:08
211 查看
题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4542
题意:中文题。
分析:其实这题本身并不是难题,但在比赛中RE了10几次,发现是没初始化tot=0,然后改了以后然后WA了。后来想了两天实在找不到原因,今天在一个学长的帮助下,才明白是数组开小了,因为可能后来越界后访问了合法的地址,所以是WA,不是RE。吃一堑,长一智吧。另外这题比较nice的方法应该是dijkstra,因为他是稠密图。稀疏图用spfa比较好。
code:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#define min(a,b) (a<b?a:b)
using namespace std;
const int MAXV=2e3+10;
const int MAXE=5e6+5;/原来我写的是4e6+5
const int INF=999999999;
int head[MAXV];
int visit[MAXV];
long long d[MAXV];
int xi[MAXV],yi[MAXV];//存储点的坐标
struct edge{int v,next,w;}es[MAXE];
int tol,n,m,k,V;
void init(){
memset(head,-1,sizeof(head));
tol=0;//千万别忘了
}
void addedge(int a,int b,int c){
es[tol].v=b;
es[tol].w=c;
es[tol].next=head[a];
head[a]=tol++;
}
int dis(int x1,int y1,int x2,int y2){
return abs(x1-x2)+abs(y1-y2);
}
bool spfa(int start,int n){
for(int i=0;i<n;++i)
visit[i]=false,d[i]=INF;
queue<int>q;
while(!q.empty())q.pop();
q.push(start);
visit[start]=true;
d[start]=0;
while(!q.empty()){
int no=q.front();q.pop();
visit[no]=false;
for(int i=head[no];i!=-1;i=es[i].next){
int to=es[i].v;
if(d[to]>d[no]+es[i].w){
d[to]=d[no]+es[i].w;
if(!visit[to]){
visit[to]=true;
q.push(to);
}
}
}
}
printf("%lld\n",min(d[1],d[0]));
}
int main(){
int T;scanf("%d",&T);
while(T--){
init();
scanf("%d%d%d",&n,&m,&k);
xi[0]=1,yi[0]=1;//0
xi[1]=n,yi[1]=m;//1
int x0,y0;scanf("%d%d",&x0,&y0);
xi[2]=x0,yi[2]=y0;//2
V=3;
for(int i=0;i<k;++i){
int x1,y1,x2,y2,fee;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&fee);
xi[V]=x1,yi[V++]=y1;
xi[V]=x2,yi[V++]=y2;
addedge(V-1,V-2,fee);
addedge(V-2,V-1,fee);
}
for(int i=0;i<V;++i)
for(int j=0;j<i;++j){
if(i==j)continue;
addedge(i,j,dis(xi[i],yi[i],xi[j],yi[j]));
addedge(j,i,dis(xi[i],yi[i],xi[j],yi[j]));
}//构图
spfa(2,V);
}
}
题意:中文题。
分析:其实这题本身并不是难题,但在比赛中RE了10几次,发现是没初始化tot=0,然后改了以后然后WA了。后来想了两天实在找不到原因,今天在一个学长的帮助下,才明白是数组开小了,因为可能后来越界后访问了合法的地址,所以是WA,不是RE。吃一堑,长一智吧。另外这题比较nice的方法应该是dijkstra,因为他是稠密图。稀疏图用spfa比较好。
code:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#define min(a,b) (a<b?a:b)
using namespace std;
const int MAXV=2e3+10;
const int MAXE=5e6+5;/原来我写的是4e6+5
const int INF=999999999;
int head[MAXV];
int visit[MAXV];
long long d[MAXV];
int xi[MAXV],yi[MAXV];//存储点的坐标
struct edge{int v,next,w;}es[MAXE];
int tol,n,m,k,V;
void init(){
memset(head,-1,sizeof(head));
tol=0;//千万别忘了
}
void addedge(int a,int b,int c){
es[tol].v=b;
es[tol].w=c;
es[tol].next=head[a];
head[a]=tol++;
}
int dis(int x1,int y1,int x2,int y2){
return abs(x1-x2)+abs(y1-y2);
}
bool spfa(int start,int n){
for(int i=0;i<n;++i)
visit[i]=false,d[i]=INF;
queue<int>q;
while(!q.empty())q.pop();
q.push(start);
visit[start]=true;
d[start]=0;
while(!q.empty()){
int no=q.front();q.pop();
visit[no]=false;
for(int i=head[no];i!=-1;i=es[i].next){
int to=es[i].v;
if(d[to]>d[no]+es[i].w){
d[to]=d[no]+es[i].w;
if(!visit[to]){
visit[to]=true;
q.push(to);
}
}
}
}
printf("%lld\n",min(d[1],d[0]));
}
int main(){
int T;scanf("%d",&T);
while(T--){
init();
scanf("%d%d%d",&n,&m,&k);
xi[0]=1,yi[0]=1;//0
xi[1]=n,yi[1]=m;//1
int x0,y0;scanf("%d%d",&x0,&y0);
xi[2]=x0,yi[2]=y0;//2
V=3;
for(int i=0;i<k;++i){
int x1,y1,x2,y2,fee;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&fee);
xi[V]=x1,yi[V++]=y1;
xi[V]=x2,yi[V++]=y2;
addedge(V-1,V-2,fee);
addedge(V-2,V-1,fee);
}
for(int i=0;i<V;++i)
for(int j=0;j<i;++j){
if(i==j)continue;
addedge(i,j,dis(xi[i],yi[i],xi[j],yi[j]));
addedge(j,i,dis(xi[i],yi[i],xi[j],yi[j]));
}//构图
spfa(2,V);
}
}
相关文章推荐
- 最短路(2)--bellman-ford和SPFA
- BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
- poj 2449 Remmarguts' Date 求第k短路(SPFA+A*)
- 【POJ 3259】Wormholes(最短路SPFA/Bellman_Ford)
- 最短路(dijkstra、spfa)
- HDU 4725 The Shortest Path in Nya Graph-【SPFA最短路】
- hdu 3873 Invade the Mars(有限制的最短路 spfa+容器)
- K短路问题模板(spfa+A*)
- 第二次CCF-4-无线网络(二维最短路-spfa)
- HDU2544:最短路【Dijkstra & SPFA】
- HDOJ 1869 六度分离 (最短路 Dijkstra && SPFA && Floyd)
- hdu 5521 Meeting【最短路SPFA+建图】
- Invitation Cards POJ - 1511 最短路spfa
- POJ 3159 Candies差分约束系统 spfa 附:各种最短路比较
- poj3259 Wormholes 最短路 spfa 负权环判断
- POJ 2263 Heavy Cargo (SPFA+Dijkstra,最短路变形)
- 最短路模板(SPFA+dijkstra)
- 最短路之--spfa
- POJ 3594 带限制的最短路 枚举+SPFA
- 【SPFA】洛谷1144 最短路计数