首页 > 代码库 > hdu 1385
hdu 1385
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 2005#define INF 0x3f3f3f3f#define LL __int64#define INF 0x3f3f3f3fint ma[N][N],d[N],vis[N],pre[N],dis[N][N],b[N];int judge(int x,int y,int v0){ int s1[2000],s2[2000],len1 = 0,len2 = 0,i,j; s1[len1++] = y,s2[len2++] =y; while(y!=v0) {s1[len1++] = pre[y];y = pre[y];} s2[len2++] = x; while(x!=v0) {s2[len2++] = pre[x];x = pre[x];} for(i = len1-1,j = len2-1 ; i>=0&&j>=0 ; i--,j--) if(s1[i]<s2[j]) return 0; else if(s1[i]>s2[j]) return 1; if(i<0&&j>=0) return 0; else if(i>=0&&j<0) return 1; return 1;}void dijkstral(int v0,int n){ int v,x,y,temp,i; for(i = 1 ; i <= n ; i++) { d[i] = dis[v0][i]; if(d[i]!=INF) pre[i] = v0; vis[i] = 0; } d[v0] = 0; vis[v0] = 1; for(i = 1 ; i <= n ; i++) { temp = INF; for(y = 1 ; y <= n ;y++) if(!vis[y]&&temp>d[y]) temp = d[x=y]; vis[x] = 1; for(y = 1 ; y <= n ; y++) if(!vis[y]&&d[x]+dis[x][y]<d[y]) { d[y] = d[x]+dis[x][y]; pre[y] = x; } else if(!vis[y]&&d[x]+dis[x][y]==d[y])//判断字典序 { if(judge(x,y,v0)) pre[y] = x; } }}int main(){ int n,m,i,j,k,s,t; while(~scanf("%d",&n),n) { for(i = 1 ; i<= n ; i++) for(j = 1 ; j<= n ; j++) { scanf("%d",&ma[i][j]); if(ma[i][j] == -1) ma[i][j] = INF; } for(i = 1 ; i<= n ;i++) scanf("%d",&b[i]); while(~scanf("%d %d",&s,&t)) { if(s==-1&&t==-1) break; for(i = 1 ; i<=n ; i++) { for(j = 1 ; j <= n ;j++) if(j!=s&&j!=t) dis[i][j] = ma[i][j]+b[j]; else dis[i][j] = ma[i][j]; } dijkstral(s,n); printf("From %d to %d :\n",s,t); printf("Path: %d",s); int sta[2000],i=0,p = t; while(p!=s){ sta[i++] = p; p = pre[p]; } for(j = i -1; j>=0 ; j--) printf("-->%d",sta[j]); printf("\nTotal cost : %d\n\n",d[t]); } } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。