Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=2923

map+floyd

#include <cstdio>
#include <cstring>
#include <cctype>
#include <map>
#include <string>
using namespace std;

const int N=110,INF=1000010;
int n,m,sz;
int g[N][N];
int q[1010];
map<string,int> mp;
void floyd()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(g[i][j]>g[i][k]+g[k][j])
                    g[i][j]=g[i][k]+g[k][j];
}
int main()
{
    int C=0,c;
    while(scanf("%d%d%d",&n,&c,&m),n||m||c)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                g[i][j]=(i==j?0:INF);
        mp.clear(); sz=0;
        for(int i=0;i<=c;i++)
        {
            char u[15];
            scanf("%s",u);
            if(mp[u]==0) mp[u]=++sz;
            int t=mp[u];
            q[i]=t;
        }
        for(int i=0;i<m;i++)
        {
            char u[15],v[15],w[15];
            scanf("%s%s%s",u,w,v);
            if(mp[u]==0) mp[u]=++sz;
            if(mp[v]==0) mp[v]=++sz;
            int uu=mp[u], vv=mp[v], ww;
            sscanf(w+2,"%d",&ww);
            if(w[strlen(w)-1]=='>' && ww<g[uu][vv]) g[uu][vv]=ww;
            if(w[0]=='<' && ww<g[vv][uu]) g[vv][uu]=ww;
        }
        floyd();
        int ans=0;
        for(int i=1;i<=c;i++) ans+=g[1][q[i]]+g[q[i]][1];
        printf("%d. %d\n",++C,ans);
    }
    return 0;
}

posted on 2012-05-13 18:03  Qiuqiqiu  阅读(204)  评论(0编辑  收藏  举报