HDU 2112HDU Today(dijk最短路+map)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2112

为什么本以为不用发博客的题最终还都得发博客。。。。这题一共错了18次。。。不说什么了。。

这题有个很坑的地方,就是起点与终点可以一样!!一样的话只能输出0。需要特判。好吧,上代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm>

using namespace std;
map<string,int>q;
int vis[200], d[200], mp[200][200], maxint=10000000;
void dijk(int n)
{
    int i, j, min1, pos;
    for(i=1; i<=n; i++)
    {
        d[i]=mp[1][i];
    }
    d[1]=0;
    vis[1]=1;
    for(i=1; i<n; i++)
    {
        min1=maxint;
        for(j=1; j<=n; j++)
        {
            if(!vis[j]&&min1>d[j])
            {
                min1=d[j];
                pos=j;
            }
        }
        if(min1==maxint)
            break;
        vis[pos]=1;
        for(j=1; j<=n; j++)
        {
            if(!vis[j]&&d[j]>mp[pos][j]+d[pos])
                d[j]=mp[pos][j]+d[pos];
        }
    }
    if(d[2]==maxint)
        printf("-1\n");
    else
        printf("%d\n",d[2]);
}
int main()
{
    int t, i, j, cnt, a, ans, flag;
    char s1[50], s2[50];
    while(scanf("%d",&t)!=EOF&&t!=-1)
    {
        q.clear();
        cnt=3;
        flag=0;
        getchar();
        scanf("%s%s",s1,s2);
        /*if(t==0)
        {
            printf("-1\n");
            continue;
        }*/
        if(strcmp(s1,s2)==0)
        {
            flag=1;
        }
        q[s1]=1;
        q[s2]=2;
        memset(vis,0,sizeof(vis));
        for(i=1; i<=200; i++)
        {
            for(j=1; j<=200; j++)
            {
                mp[i][j]=maxint;
            }
        }
        while(t--)
        {
            getchar();
            scanf("%s%s%d",s1,s2,&a);
            if(!q[s1])
                q[s1]=cnt++;
            if(!q[s2])
                q[s2]=cnt++;
            mp[q[s1]][q[s2]]=mp[q[s2]][q[s1]]=a;
        }
        if(flag)
        {
            printf("0\n");
            continue;
        }
        if(t==0)
            {
                printf("-1\n");
                continue;
            }
        dijk(cnt-1);
    }
    return 0;
}


你可能感兴趣的:(编程,算法,C语言)