UVa 10009 - All Roads Lead Where?

来源:互联网 发布:电脑什么拍照软件 编辑:程序博客网 时间:2024/06/05 03:07

题目:给你一些地名,以及他们的相连关系,求两点间的最短路径,输出路径。

分析:最短路。根据题意给出的图形应该是一棵树,直接利用bfs求解即可,不需要设置标记数组。

            利用hash表,建立地名和地点id的一一映射,利用邻接表建图,最后运行bfs即可。

注意:输出格式,每组之间有一个换行。

#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;//hashtypedef struct h_node {char    name[101];int     id;h_node *next;}hnode;hnode* h_head[1000001];hnode  h_node[1001];int  h_count;int  h_table[9] = {3,13,31,131,313,1313,3131,13131};void hash_inital(){h_count = 0;memset( h_head, 0, sizeof(h_head) );}int hash_id( char* name ){int value = 0;for ( int i = 0 ; name[i] ; ++ i )value = (value+name[i]*h_table[i%8])%1000000;for ( hnode* p = h_head[value] ; p ; p = p->next )if ( !strcmp( p->name, name ) )return p->id;strcpy( h_node[h_count].name, name); h_node[h_count].id = h_count;h_node[h_count].next = h_head[value];h_head[value] = &h_node[h_count];return h_count ++;}//end_hash//linktypedef struct e_node {int point;e_node *next;}enode;enode *e_head[1001];enode  e_node[2000002];int  e_count;void link_inital(){e_count = 0;memset( e_head, 0, sizeof(e_head) );}void link_add( int a, int b ){e_node[e_count].point = b;e_node[e_count].next = e_head[a];e_head[a] = &e_node[e_count ++];}//end_linkint  used[1001];int  frot[1001];int  queue[1001];void bfs( int s ){memset( used, 0, sizeof(used) );int move = 0,save = 0;used[s] = 1;frot[s] = s;queue[save ++] = s;while ( move < save ) {int now = queue[move ++];for ( enode* p = e_head[now] ; p ; p = p->next )if ( !used[p->point] ) {used[p->point] = 1;frot[p->point] = now;queue[save ++] = p->point;}}}char city1[101];char city2[101];void output( int s ){if ( s != frot[s] ) output( frot[s] );printf("%c",h_node[s].name[0]);}int main(){int t,n,m,id1,id2;while ( cin >> t )while ( t -- ) {cin >> n >> m;link_inital();hash_inital();for ( int i = 0 ; i < n ; ++ i ) {cin >> city1 >> city2;id1 = hash_id( city1 );id2 = hash_id( city2 );link_add( id1, id2 );link_add( id2, id1 );}for ( int i = 0 ; i < m ; ++ i ) {cin >> city1 >> city2;bfs( hash_id( city1 ) );output( hash_id( city2 ) );printf("\n");}if ( t ) printf("\n");}}

0 0