完全的套用bellman-ford算法 注意:到达终点后不能再返回,也就是说包括终点的负环不算!WA了好久 代码如下: #include <stdio.h> int const maxn = 910; int const maxm = 3610; int const Max = 0xfffffff; struct node { int v,t; node *next; }edge[maxm*2]; node *adj[maxn]; int W,H,N,E,G,len; int dis[maxn]; bool isG[maxn]; void init() { int i,num = W*H; for(i=0;i<num;i++) { adj[i] = NULL; isG[i] = false; dis[i] = Max; } dis[0] =len = 0; } void addEage(int u,int v,int t) { edge[len].v = v; edge[len].t = t; edge[len].next = adj[u]; adj[u] = &edge[len]; len++; } void input() { int i,j,x,y,a,b,t; scanf("%d",&G); for(i=0;i<G;i++) { scanf("%d%d",&x,&y); isG[y*W+x] = true; } scanf("%d",&E); for(i=0;i<E;i++) { scanf("%d%d%d%d%d",&x,&y,&a,&b,&t); addEage(y*W+x,b*W+a,t); } for(i=0;i<W;i++) for(j=0;j<H;j++) { t = i+j*W; if(!isG[t] && adj[t]==NULL) // 不是墓碑,也不是冲洞 { // 左 if(i>0 && !isG[t-1]) addEage(t,t-1,1); // 右 if(i<W-1 && !isG[t+1]) addEage(t,t+1,1); // 上 if(j<H-1 && !isG[t+W]) addEage(t,t+W,1); // 下 if(j>0 && !isG[t-W]) addEage(t,t-W,1); } } } void bellman_ford() { int i,num,tmp; node *ptr; num = W*H; for(int j=1;j<num;j++) { for(i=0;i<num-1;i++) { if(dis[i] == Max) continue; for(ptr=adj[i];ptr!=NULL;ptr=ptr->next) { tmp = dis[i] + ptr->t; if(tmp < dis[ptr->v]) dis[ptr->v] = tmp; } } } } bool check() { int i,num,tmp; node *ptr; num = W*H; for(i=0;i<num-1;i++) { if(dis[i] == Max) continue; for(ptr=adj[i];ptr!=NULL;ptr=ptr->next) { tmp = dis[i] + ptr->t; if(tmp < dis[ptr->v]) return true; } } return false; } int main() { while(scanf("%d%d",&W,&H) && (W||H)) { init(); input(); bellman_ford(); if(check()) { printf("Never/n"); continue; } if(dis[W*H-1] == Max) { printf("Impossible/n"); continue; } printf("%d/n",dis[W*H-1]); } return 0; }