水题堆3.T - HDU Today (dijkstra

#include <stdio.h>
#include <string.h>
#define INF 1e7
int min(int a,int b)
{
    return a<b?a:b;
}
int main()
{
    int n,i,j,k,t,u,a,b,used[200],cost[200][200],d[200];
    char s[50],e[50],f[200][50];
    while(scanf("%d",&n)){
        if(n==-1)break;
        scanf("%s%s",s,e);
        int flag=0;
        memset(f,0,sizeof(int)*200);
        for(i=0;i<=150;i++){
            for(j=0;j<=150;j++){
                cost[i][j]=cost[j][i]=INF;
            }
        }
        strcpy(f[0],s);
        strcpy(f[1],e);
        /*if(strcmp(s,e)==0){
            printf("0\n");
            continue;
        }*/
        k=2;
        for(i=0;i<=n-1;i++){
            scanf("%s%s%d",s,e,&t);
            for(j=0;j<=k-1;j++){
                if(strcmp(s,f[j])==0){
                    flag=1;
                    a=j;
                }
            }
            if(flag==0)a=k++;
            strcpy(f[a],s);
            flag=0;
            for(j=0;j<=k-1;j++){
                if(strcmp(e,f[j])==0){
                    flag=1;
                    b=j;
                   // printf("lllllllllll\n");
                }
            }
            if(flag==0)b=k++;
            strcpy(f[b],e);
            flag=0;
            if(t<cost[a][b])cost[a][b]=cost[b][a]=t;
            //printf("%d,%d,%d,\n",a,b,t);
        }
        //·Ö¸îÏß
        for(i=0;i<=k-1;i++){
            d[i]=INF;
        }
        memset(used,0,sizeof(int)*k);
        d[0]=0;
        while(1){
            int v=-1;
            for(u=0;u<=k-1;u++){
                if(!used[u]&&(v==-1||d[u]<d[v]))v=u;
            }
            if(v==-1)break;
            used[v]=1;
            for(u=0;u<=k-1;u++){
                d[u]=min(d[u],d[v]+cost[v][u]);
            }
        }
        if(strcmp(f[0],f[1])==0){
            printf("0\n");
            continue;
        }
        if(d[1]!=INF)printf("%d\n",d[1]);
        else printf("-1\n");
    }
    return 0;
}

最短路问题

主要问题是将地名和数字对应起来

每输入一次s,e,t都进行一次处理,对于s,e分别寻找之前是否已储存过这个地名,如果没有,就为新地名取一个对应的数字,如果有,就记录下这个地名对应的数字,处理完后用cost数组储存两地的距离

迪杰斯特拉算法之前的题解里已经说过了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值