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

把地名和数字对应一下,就变成模板题了

#include <iostream>
#include <string>
using namespace std;
const int INF=10000000;
const int maxn=101;
int nid,f;
int Map[maxn][maxn];
int vis[maxn];
int dis[maxn];
string Id[maxn];
int strtonum(string s)
{
    for(int i=0;i<nid;i++)
        if(Id[i] == s)
            return i;
    Id[nid]=s;
    return nid++;
}
int Dijkstra(int s,int t)
{
    for(int i=0;i<nid;i++)
        dis[i]=INF;
    dis[s]=0;
    for(int i=0;i<nid;i++)
    {
        int ans=INF,u;
        for(int j=0;j<nid;j++)
            if(!vis[j] && dis[j]<ans)
            { 
                ans=dis[j];
                u=j;
            }
        vis[u]=1;
        if(u==t){f=1;return ans;}
        for(int j=0;j<nid;j++)
            if(Map[u][j]!=INF && dis[j]>Map[u][j]+dis[u])
                dis[j]=Map[u][j]+dis[u];
    }
}
int main() 
{
    int n;
    while(scanf("%d",&n),n!=-1)
    {
        nid=f=0;
        memset(vis,0,sizeof(vis));
        for(int i=0;i<maxn;i++)
            for(int j=0;j<maxn;j++)
                Map[i][j]=INF;
        string p,q,a,b;
        int d,s,t;
        cin >> p >> q;
        s=strtonum(p);
        t=strtonum(q);
        while(n--)
        {
            cin >> a >> b >> d;
            int x,y;
            x=strtonum(a);
            y=strtonum(b);
            if(Map[x][y]>d)
                Map[x][y]=Map[y][x]=d;
        }
        int ans=Dijkstra(s,t);
        if(f)
            printf("%d\n",ans);
        else 
            puts("-1");
    }
    return 0;
}
View Code