題意:

有兩個人要碰面,問說那哪個點碰面可以讓兩個人走的路相加最少,輸出走的長度以及最好的點,如果有多個最好的點就都要輸出

點有A-Z,路有分年輕人可以走以及老人可以走的,然後有單向的路以及雙向的路

 

解法:

做兩個map,分別是年輕人的路以及老人的路,做 all pair shortest path;要小心有重複的路的話要取值最小的,然後自己到自己是0

 

程式碼:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define INF 1<<29

int map[2][30][30];
int n;
char str[123];
char a[123],b[123];
int main(){
    int i,j,k;
    int w;
    int c;
    while(scanf("%d",&n)!=EOF &&n ){
        for(i=0;i<26;++i){
            for(j=0;j<26;++j){
                map[0][i][j] = INF;
                map[1][i][j] = INF;
            }
        }
        for(i=0;i<26;++i){
            map[0][i][i] = 0;
            map[1][i][i] = 0;
        }
        while(n--){
            scanf("%s",str);
            w = (str[0]=='Y')?0:1;
            scanf("%s %s %s %d",str,a,b,&c);
            if(map[w][a[0]-'A'][b[0]-'A']>c)
                map[w][a[0]-'A'][b[0]-'A'] = c;
            if(str[0]=='B'  && map[w][b[0]-'A'][a[0]-'A']>c)
                map[w][b[0]-'A'][a[0]-'A'] = c;
        }
        for(w=0;w<2;++w){
            for(k=0;k<26;++k){
                for(i=0;i<26;++i){
                    for(j=0;j<26;++j){
                        if(map[w][i][j] > map[w][i][k]+map[w][k][j])
                            map[w][i][j] = map[w][i][k]+map[w][k][j];
                    }
                }
            }
        }
        scanf("%s %s",a,b);
        j = a[0]-'A';
        k = b[0]-'A';
        for(i=c=0;i<26;++i){
            if(map[0][j][i]+map[1][k][i] < map[0][j][c]+map[1][k][c])
                c = i;
        }
        if(map[0][j][c]+map[1][k][c] >= INF){
            puts("You will never meet.");
        }else {
            printf("%d",map[0][j][c]+map[1][k][c]);
            for(i=c;i<26;++i){
                if(map[0][j][i]+map[1][k][i] == map[0][j][c]+map[1][k][c])
                    printf(" %c",i+'A');
            }
            puts("");
        }
    }

    return 0;
}

arrow
arrow
    全站熱搜

    alan790712 發表在 痞客邦 留言(0) 人氣()