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 :\n", st, et);
                printf("Path: %d\n",st);    
                printf("Total cost : %d\n", 0);
                printf("\n");
            }
            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] = '\0';
                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 :\n", 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\n", dt[ans].ans[i]);
                }
                printf("Total cost : %d\n", dt[ans].fei);
                printf("\n");
            }
        }
    }
    return 0;
}

 

posted @ 2015-04-28 23:04  Fighting_Heart  阅读(188)  评论(0编辑  收藏  举报