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