zoukankan      html  css  js  c++  java
  • hdu 1385 Minimum Transport Cost

    BFS注意字典序的问题。WA了好多发。

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int maxn = 70;
    int n, cost[maxn][maxn],bb[maxn], ji[maxn];
    struct abc{
        int node, fei;
        int ans[maxn];
        int q = 0;
    }dt[90000];
    int main()
    {
        int i, j, k, ans;
        while (~scanf("%d", &n))
        {
            if (n == 0) break;
            for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) scanf("%d", &cost[i][j]);
            for (i = 1; i <= n; i++) scanf("%d", &bb[i]);
            int st, et;
            while (1)
            {
                scanf("%d%d", &st, &et);
                if (st == -1 && et == -1) break;
                if (st == et) 
                {
                    printf("From %d to %d :
    ", st, et);
                    printf("Path: %d
    ",st);    
                    printf("Total cost : %d
    ", 0);
                    printf("
    ");
                }
                else
                {
                    for (i = 0; i < maxn; i++) ji[i] = 999999999;
                    int b = 0; dt[0].node = st; dt[0].fei = 0; dt[0].ans[0] = st;
                    dt[0].q = 1; ji[st] = 0;
                    int minn = 999999999;
                    for (i = 0; i <= b; i++)
                    {
                        for (j = 1; j <= n; j++)
                        {
                            if (cost[dt[i].node][j] != -1 && dt[i].node != j)
                            {
                                if (j == et)
                                {
                                    if (dt[i].fei + cost[dt[i].node][j] <= ji[j])
                                    {
                                        ji[j] = dt[i].fei + cost[dt[i].node][j];
                                        b++;
                                        minn = dt[i].fei + cost[dt[i].node][j];
                                        dt[b].q = dt[i].q + 1;
                                        dt[b].fei = dt[i].fei + cost[dt[i].node][j];
                                        dt[b].node = j;
                                        for (k = 0; k < dt[b].q; k++)
                                        {
                                            if (k < dt[b].q - 1)dt[b].ans[k] = dt[i].ans[k];
                                            else if (k == dt[b].q - 1) dt[b].ans[k] = j;
                                        }
                                    }
                                }
                                else if (j != et)
                                {        
                                    if (dt[i].fei + cost[dt[i].node][j] + bb[j] <= ji[j])
                                    {
                                        ji[j] = dt[i].fei + cost[dt[i].node][j] + bb[j];
                                        b++;
                                        dt[b].q = dt[i].q + 1;
                                        dt[b].node = j;
                                        dt[b].fei = dt[i].fei + cost[dt[i].node][j] + bb[j];
                                        for (k = 0; k < dt[b].q; k++)
                                        {
                                            if (k < dt[b].q - 1)dt[b].ans[k] = dt[i].ans[k];
                                            else if (k == dt[b].q - 1) dt[b].ans[k] = j;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    int kk;
                    char s[1000]; s[0] = 'z'; s[1] = 'z'; s[2] = '';
                    char k[1000];
                    for (i = 0; i <= b; i++)
                    {
                        if (dt[i].fei == ji[et]&&dt[i].ans[dt[i].q-1]==et)
                        {
                            for (kk = 0; kk < dt[i].q; kk++) k[kk] = dt[i].ans[kk];
                            k[dt[i].q] = 0;
                            if (strcmp(s, k)>0) { strcpy(s, k); ans = i; }
                        }
                    }
                    printf("From %d to %d :
    ", st, et);
                    printf("Path: ");
                    for (i = 0; i < dt[ans].q; i++)
                    {
                        if (i < dt[ans].q - 1) printf("%d-->", dt[ans].ans[i]);
                        else printf("%d
    ", dt[ans].ans[i]);
                    }
                    printf("Total cost : %d
    ", dt[ans].fei);
                    printf("
    ");
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    解决beego运行程序报错问题:stderr: go: github.com/astaxie/beego@v1.12.1: missing go.sum entry
    Flutter-填平菜鸟和高手之间的沟壑
    百度地图的脑残设计,附上代码,为后来的码农们...
    迅捷Flutter图片浏览软件
    青峰Flutter视频播放软件
    Element UI 自定义Validator
    在C#中如何URL编码和解码
    Postman新手入门
    安装SSDT2017
    layer.prompt 输入值为空的时候点击confirm不能继续
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4464355.html
Copyright © 2011-2022 走看看