soj4542 二基樓的迷宮 最短路+spfa

題目鏈接: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);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章