joj Fatmouse and JavaBean

 

 

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int nodesize=1010; const int inf=1<<28; int n,m; int s,t,cat; int bean[nodesize]; int map[nodesize][nodesize]; int d[nodesize],pre[nodesize],c[nodesize],h[nodesize]; int cd[nodesize]; bool vis[nodesize]; void init() { int x,y,c; for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=inf; for(int i=0; i<n; ++i) scanf("%d",&bean[i]); for(int i=0; i<m; ++i) { scanf("%d%d%d",&x,&y,&c); map[x][y]=min(map[x][y],c);//防止重边 map[y][x]=map[x][y]; } scanf("%d%d%d",&s,&cat,&t); } bool Dijstra(int s) { for(int i=0; i<n; ++i) { d[i]=inf; h[i]=0; pre[i]=i; c[i]=0; vis[i]=0; } c[s]=1;//道路方案数 d[s]=bean[s];//距离 h[s]=bean[s];//拿到的豌豆数 pre[s]=-1;//前继 vis[s]=1;//已被访问过 int now=s;//暂时用来更新的点 for(int i=0; i<n; ++i) { for(int j=0; j<n; ++j) if(!vis[j]&&map[now][j]!=inf) { if(d[j]==d[now]+map[now][j]+bean[j])//用now去更新j这个点 { if(h[now]+bean[j]>h[j]) { h[j]=h[now]+bean[j]; pre[j]=now; c[j]=c[now]; } else if(h[now]+bean[j]==h[j]) c[j]+=c[now]; } else if(d[j]>d[now]+map[now][j]+bean[j]) { d[j]=d[now]+map[now][j]+bean[j]; pre[j]=now; c[j]=c[now]; h[j]=h[now]+bean[j]; } } int rmin=inf; for(int j=0; j<n; ++j) if(!vis[j]&&d[j]<rmin) { rmin=d[j]; now=j; } vis[now]=1; } if(c[t]>1) { printf("Hard to say/n"); return false; } return true; } void Dijstra2(int s) { for(int i=0; i<n; ++i) { cd[i]=inf; vis[i]=0; } cd[s]=0;//距离 vis[s]=1;//已被访问过 int now=s;//暂时用来更新的点 for(int i=0; i<n; ++i) { for(int j=0; j<n; ++j) if(!vis[j]&&map[now][j]!=inf) { if(cd[j]>cd[now]+map[now][j]) cd[j]=cd[now]+map[now][j]; } int rmin=inf; for(int j=0; j<n; ++j) if(!vis[j]&&cd[j]<rmin) { rmin=cd[j]; now=j; } vis[now]=1; } } void check(int t) { int rmin=-1; if(d[t]>=cd[t]) rmin=t; // printf("%d/n",t); while(pre[t]!=-1) { // printf("%d/n",t); t=pre[t]; if(d[t]>=cd[t]) rmin=t; } if(rmin==-1) printf("No way/n"); else printf("%d/n",rmin); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { if(n==0) break; init(); if(!Dijstra(s)) continue;//求老鼠到终点的最短路 Dijstra2(cat); check(t); } return 0; }  

你可能感兴趣的:(joj Fatmouse and JavaBean)