HDU1546

题意:给定一些单词,前一个的尾和后一个的头相同时,才表示他们相连

求最短路

View Code
  1 #include<stdio.h>

  2 #include<string>

  3 #include<stdlib.h>

  4 #include<queue>

  5 #include<map>

  6 #include<algorithm>

  7 using namespace std;

  8 const int maxn = 1015;

  9 const int inf = INT_MAX;

 10 //map<string,int>mp;

 11 struct node{

 12     char s[ 505 ];

 13     int val;

 14 }a[ maxn ];

 15 struct Node{

 16     int u,val,next;

 17 }edge[ maxn*maxn ];

 18 int head[ maxn ],cnt;

 19 int dis[ maxn ],vis[ maxn ];

 20 int n;

 21 //int CNT;

 22 void init(){

 23     cnt=0;

 24     //CNT=1;

 25     //mp.clear();

 26     memset( head,-1,sizeof( head ));

 27 }

 28 void addedge( int a,int b,int c ){

 29     edge[ cnt ].u=b;

 30     edge[ cnt ].val=c;

 31     edge[ cnt ].next=head[ a ];

 32     head[ a ]=cnt++;

 33 }

 34 

 35 int bfs(){

 36     queue<int>q;

 37     while( !q.empty() )

 38         q.pop();

 39     for( int i=0;i<maxn;i++ ){

 40         dis[i]=inf;

 41         vis[ i ]=0;

 42     }

 43     int now,next;

 44     now=1;

 45     dis[now]=0;

 46     vis[now]=1;

 47     q.push(now);

 48     while( !q.empty() ){

 49         now=q.front(),q.pop();

 50         vis[now]=0;

 51         for( int i=head[now];i!=-1;i=edge[ i ].next ){

 52             next=edge[ i ].u;

 53             if( dis[next]>dis[now]+edge[i].val ){

 54                 dis[next]=dis[now]+edge[i].val;

 55                 if( vis[next]==0 ){

 56                     vis[next]=1;

 57                     q.push(next);

 58                 }

 59             }

 60         }

 61     }

 62     if( dis[n]==inf )

 63         return -1;

 64     else

 65         return dis[n];

 66     /*

 67     if( dis[get_first_num(a[n-1].s) ]!=inf||dis[get_last_num(a[n-1].s) ]!=inf )

 68         return min( dis[get_first_num(a[n-1].s) ],dis[get_last_num(a[n-1].s) ] );

 69     else 

 70         return -1;

 71     */

 72 }

 73 

 74 int judge( int i,int j ){

 75     int len=strlen(a[i].s);

 76     if( a[i].s[len-4]!=a[j].s[0] )

 77         return -1;

 78     if( a[i].s[len-3]!=a[j].s[1] )

 79         return -1;

 80     if( a[i].s[len-2]!=a[j].s[2] )

 81         return -1;

 82     if( a[i].s[len-1]!=a[j].s[3] )

 83         return -1;

 84     return 1;

 85 }

 86 

 87 int main(){

 88     while( scanf("%d",&n),n ){

 89         init();

 90         //int num1,num2;

 91         for( int i=1;i<=n;i++ ){

 92             scanf("%d%s",&a[i].val,a[i].s);

 93         }

 94         for( int i=1;i<=n;i++ ){

 95             for( int j=1;j<=n;j++ ){

 96                 if( i!=j ){

 97                     /*

 98                     num1=get_last_num(a[i].s);

 99                     num2=get_first_num(a[j].s);

100                     if( num1==num2 ){

101                         addedge( i,j,a[i].val );//mat[num1][num2]=a[i].val;

102                     }

103                     */

104                     if( judge(i,j)==1 )

105                         addedge( i,j,a[i].val );

106                 }

107             }

108         }

109         int flag=bfs();

110         printf("%d\n",flag);

111     }

112     return 0;

113 }

开始想复杂了,以为要把每个单词拆开来。。。

后来看了别人的才发现单词首尾相同即可表示i,j两个相连。。。。

 

你可能感兴趣的:(HDU)