最短路径题,题意简洁,思路清晰,不过WA了N次。

(1)许多细节没处理好。

(2)字符串的处理不到位,后来是看了别人的解题报告才用的map过的。

(3)可能存在起点与终点相同的情况,而且不能直接输出0,必须用标记,因为可能数据还没处理完。

CODE:

 

#include<stdio.h>
#include<map>             //map容器
#include<stdlib.h>
#include<string.h>
using namespace std;

#define INF 0x3f3f3f3f 
const int SIZE = 155;
int w[SIZE][SIZE];
int v[SIZE], d[SIZE];
char beg[SIZE], end[SIZE];
int flag;


int Dijsktra(int s, int n)
{
    int i, j;
    for(i = 1; i <= n; i++) d[i] = (i == s)? 0:INF;
    for(i = 1; i <= n; i++)
    {
        int x, m = INF;
        for(int y = 1; y <= n; y++)    if(!v[y] && d[y] < m) m = d[x=y];
        v[x] = 1;
        if(m == INF) break;
        for(int y = 1; y <= n; y++) d[y] <?= d[x] + w[x][y];
    }
}


void init()
{
    memeset(w, INF, sizeof(w));
    memset(v, 0sizeof(v));
    memset(d, 0sizeof(d));
    flag = 0;
}


int main()
{
    int cnt, n;
    map<stringint> my_map;        //map容器的定义
    while(~scanf("%d", &n), n != -1)
    {
        init();
        my_map.clear();
        scanf("%s%s", beg, end);   
        if(!strcmp(beg, end)) flag = 1;   //若直接printf("0\n");可能报错,可能是因为数据没输完。 
        my_map[beg] = 1;
        my_map[end] = 2;
        cnt = 3;               //cnt的处理 
        while(n--)
        {
            char sz1[SIZE], sz2[SIZE];
            int dis;
            scanf("%s%s%d", sz1, sz2, &dis);
            if(!my_map[sz1])    my_map[sz1] = cnt++;
            if(!my_map[sz2])     my_map[sz2] = cnt++;
            if(w[my_map[sz1]][my_map[sz2]] > dis)
            {
                w[my_map[sz1]][my_map[sz2]] = w[my_map[sz2]][my_map[sz1]] = dis;
            }
        }
        if(flag)
        {
            printf("0\n");
            continue;
        }
         Dijsktra(1, cnt);
         if(d[2] == INF)    printf("-1\n");
         else    printf("%d\n", d[2]);
    }
    return 0;
}

 

posted on 2012-08-28 16:52  有间博客  阅读(596)  评论(0编辑  收藏  举报