HDU Today(迪杰斯特拉最短路算法+map函数+情况考虑完全)

https://vjudge.net/contest/270244#problem/U

最短路算法,用map函数储存字符串,标号为数字;

注意判断重复点,重复点不需要标号;

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int d[155][155];//储存原始长度
int dis[155];//储存始点到i点距离
int visit[155];//标记
int m;
char x[35],y[35];//用于输入的字符串
int t;
map<string,int>mp;
void init()
{
    mp.clear();
    getchar();
    cin>>x>>y;
    mp[x]=1;
    t=2;
    while(!mp[y])
    {
        mp[y]=t++;
    }
    memset(d,INF,sizeof(d));
    memset(visit,0,sizeof(visit));
    char a[30],b[30];
    int c;
    for(int i=1; i<=m; i++)
    {
        getchar();
        cin>>a>>b>>c;
        if(!mp[a])
        {
            mp[a]=t++;
        }
        if(!mp[b])
        {
            mp[b]=t++;//编号;
        }
        //防止有重复编号的点;
        if(d[mp[a]][mp[b]]>=c)
        {
            d[mp[b]][mp[a]]=d[mp[a]][mp[b]]=c;//处理有重复边
        }
        for(int i=1; i<t; i++)
        {
            dis[i]=d[1][i];
        }
        visit[1]=1;
        dis[1]=0;
    }
}
void dijkstra()
{
    int mins,k;
    for(int i=1; i<t; i++)
    {
        mins=INF;
        for(int j=1; j<t; j++)
        {
            if(!visit[j]&&dis[j]<mins)
            {
                k=j;
                mins=dis[j];
            }
        }//找到与之相邻的最短距离点;
        if(mins==INF)break;
        visit[k]=1;
        for(int j=1; j<t; j++)
        {
            if(!visit[j]&&dis[j]>dis[k]+d[k][j])
            {
                dis[j]=dis[k]+d[k][j];
            }
        }
    }
}
int main()
{
    while(scanf("%d",&m)&&(m!=-1))
    {
        init();
        dijkstra();
        if(dis[mp[y]]==INF)//刚开始没有考虑起点和终点重合,一定要记住有可能重合
            printf("-1\n");
        else
            printf("%d\n",dis[mp[y]]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/84135047