hdu 4360

/*
题目大意是
给一个n个点m条边的无向图。
每条边有权值和一个字母标号,字母标号有四种 'L' 'O' 'V' 'E'
现在要从1点到n点去
找求找到一条路径,路径按顺序构成了若干个LOVE 注意必须是完整的LOVE
然后要求有LOVE的的条件下路径最短,如果有多条最短路,找LOVE最多的那条
思路就是拆点
将每个点分为四个,代表L,LO,LOV, LOVE四种状态
*/

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<map>
using namespace std;
const long long maxn = 10000;
long long inf = 0xfffffff;
struct nd{
    long long v,t,w,next;
}edge[maxn*20];
long long head[maxn],dp[maxn][4][2],vis[maxn][4];
long long ecnt,N,M;
map<int,int>as,bs;
void add(long long u,long long v,long long t,long long w)
{
    edge[ecnt].v = v;
    edge[ecnt].w = w;
    edge[ecnt].t = t;
    edge[ecnt].next = head[u];
    head[u] = ecnt++;
}
void readin()
{
    long long i,u,v,w;
    char s[10];
    scanf("%I64d %I64d",&N,&M);
    memset(head,-1,sizeof(head));
    ecnt = 0;
    for(i = 0; i < M; ++ i){
        scanf("%I64d %I64d %I64d %s",&u,&v,&w,s);
        add(u,v,as[(int)s[0]],w);
        add(v,u,as[(int)s[0]],w);
    }
}
void bfs()
{
    long long i,u,v,w,t,k,c;
    for(i = 0; i <= N; ++ i)
        for(t = 0; t < 4; ++ t)
            dp[i][t][0]=inf,dp[i][t][1]=0,vis[i][t]=0;
    queue<int>que,sue;
    dp[1][3][0] = 0;
    que.push(1);
    sue.push(3);
    while(!que.empty()){
        u = que.front(); que.pop();
        k = sue.front(); sue.pop();
        c = bs[k]; vis[u][k] = 0;
        for(i = head[u]; ~i; i = edge[i].next){
            v = edge[i].v;
            t = edge[i].t;
            w = edge[i].w;
            if(t^c)continue;
            if(dp[u][k][0]+w==dp[v][t][0]){
                if(dp[u][k][1]>=dp[v][t][1]){
                    dp[v][t][1] = dp[u][k][1] + 1;
                    if(!vis[v][t]){
                        que.push(v);
                        sue.push(t);
                        vis[v][t] = 1;
                    }
                }
            }else if(dp[u][k][0] + w < dp[v][t][0]|| dp[v][t][0]==0){
                dp[v][t][0] = dp[u][k][0] + w;
                dp[v][t][1] = dp[u][k][1] + 1;
                if(!vis[v][t]){
                        que.push(v);
                        sue.push(t);
                        vis[v][t] = 1;
                }
            }
        }
    }
}
int main()
{
    long long T,cas=0;
    inf = inf * inf;
    as[(int)'L']=0; as[(int)'O']=1; as[(int)'V']=2; as[(int)'E']=3;
    bs[0] = 1; bs[1] = 2; bs[2] = 3; bs[3] = 0;
    for(scanf("%I64d",&T); T--;){
        readin();
        bfs();
        if(dp[N][3][1]<4||dp[N][3][0]==inf)
        printf("Case %I64d: Binbin you disappoint Sangsang again, damn it!\n",++cas);
        else
        printf("Case %I64d: Cute Sangsang, Binbin will come with a donkey after travelling %I64d meters and finding %I64d LOVE strings at last.\n",++cas,dp[N][3][0],dp[N][3][1]/4);
    }
    return 0;
}

posted on 2012-08-15 20:41  aigoruan  阅读(242)  评论(0)    收藏  举报

导航