HDU 2112 HDU Today

 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

 

 

你可能感兴趣的:(HDU)