hdu 4360 As long as Binbin loves Sangsang
#include<stdio.h> #include<vector> #include<string.h> #include<queue> #include<iostream> using namespace std; #define N 2000 __int64 C=(__int64)1<<60; vector<__int64>pn[N],sn[N]; vector<char>vn[N]; queue<__int64>que; __int64 dp[N][4][2]; __int64 bj[N]; __int64 n,cnt=1; void spa(__int64 rt) { memset(bj,0,sizeof(bj)); dp[1][3][0]=0; while(!que.empty()) que.pop(); que.push(rt); __int64 now,i; while(!que.empty()) { now=que.front();que.pop(); bj[now]=0; for(i=0;i<pn[now].size();i++) { if(vn[now][i]=='L') { if(dp[pn[now][i]][0][0]>(dp[now][3][0]+sn[now][i])||(dp[pn[now][i]][0][0]==(dp[now][3][0]+sn[now][i])&&dp[pn[now][i]][0][1]<=dp[now][3][1])||(dp[now][3][0]<C&&dp[pn[now][i]][0][1]==0)) { dp[pn[now][i]][0][0]=(dp[now][3][0]+sn[now][i]); dp[pn[now][i]][0][1]=dp[now][3][1]+1; if(!bj[pn[now][i]]) que.push(pn[now][i]); } } if(vn[now][i]=='O') { if(dp[pn[now][i]][1][0]>(dp[now][0][0]+sn[now][i])||(dp[pn[now][i]][1][0]==(dp[now][0][0]+sn[now][i])&&dp[pn[now][i]][1][1]<dp[now][0][1])||(dp[now][0][0]<C&&dp[pn[now][i]][1][1]==0)) { dp[pn[now][i]][1][0]=(dp[now][0][0]+sn[now][i]); dp[pn[now][i]][1][1]=dp[now][0][1]; if(!bj[pn[now][i]]) que.push(pn[now][i]); } } if(vn[now][i]=='V') { if(dp[pn[now][i]][2][0]>(dp[now][1][0]+sn[now][i])||(dp[pn[now][i]][2][0]==(dp[now][1][0]+sn[now][i])&&dp[pn[now][i]][2][1]<dp[now][1][1])||(dp[now][1][0]<C&&dp[pn[now][i]][2][1]==0)) { dp[pn[now][i]][2][0]=(dp[now][1][0]+sn[now][i]); dp[pn[now][i]][2][1]=dp[now][1][1]; if(!bj[pn[now][i]]) que.push(pn[now][i]); } } if(vn[now][i]=='E') { if(dp[pn[now][i]][3][0]>(dp[now][2][0]+sn[now][i])||(dp[pn[now][i]][3][0]==(dp[now][2][0]+sn[now][i])&&dp[pn[now][i]][3][1]<dp[now][2][1])||(dp[now][2][0]<C&&dp[pn[now][i]][3][1]==0)) { dp[pn[now][i]][3][0]=(dp[now][2][0]+sn[now][i]); dp[pn[now][i]][3][1]=dp[now][2][1]; if(!bj[pn[now][i]]) que.push(pn[now][i]); } } } } printf("Case %d: ",cnt++); if(dp[n][3][1]>0) printf("Cute Sangsang, Binbin will come with a donkey after travelling %I64d meters and finding %I64d LOVE strings at last.\n",dp[n][3][0],dp[n][3][1]); else printf("Binbin you disappoint Sangsang again, damn it!\n"); } int main() { __int64 t; __int64 i,j,m; __int64 a,b,c; char d; scanf("%I64d",&t); while(t--) { scanf("%I64d %I64d",&n,&m); for(i=0;i<=n;i++) { pn[i].clear();sn[i].clear();vn[i].clear();} for(i=0;i<m;i++) { scanf("%I64d %I64d %I64d %c",&a,&b,&c,&d); pn[a].push_back(b); sn[a].push_back(c); vn[a].push_back(d); pn[b].push_back(a); sn[b].push_back(c); vn[b].push_back(d); } for(i=0;i<=n;i++) for(j=0;j<4;j++) { dp[i][j][0]=C;dp[i][j][1]=0;} spa(1); } return 0; }