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;
}

 

posted @ 2012-08-15 21:01  zhuiy  阅读(136)  评论(0编辑  收藏  举报