hdu 1546 Idiomatic Phrases Game

http://acm.hdu.edu.cn/showproblem.php?pid=1546

 1 #include <cstdio>

 2 #include <iostream>

 3 #include <queue>

 4 #include <cstring>

 5 #include <algorithm>

 6 #define maxn 1001

 7 using namespace std;

 8 const int inf=1<<30;

 9 

10 int a[maxn],n;

11 int g[maxn][maxn];

12 char str[maxn][maxn];

13 int dis[maxn];

14 bool vis[maxn];

15 

16 void spfa()

17 {

18     queue<int>q;

19     memset(vis,false,sizeof(vis));

20     for(int i=0; i<=n; i++) dis[i]=inf;

21     dis[0]=0;

22     vis[0]=true;

23     q.push(0);

24     while(!q.empty())

25     {

26         int u=q.front(); q.pop();

27         vis[u]=false;

28         for(int i=0; i<n; i++)

29         {

30             if(g[u][i]!=inf&&dis[i]>dis[u]+g[u][i])

31             {

32                 dis[i]=dis[u]+g[u][i];

33                 if(!vis[i])

34                 {

35                     q.push(i);

36                     vis[i]=true;

37                 }

38             }

39         }

40     }

41 }

42 

43 int main()

44 {

45     while(scanf("%d",&n)!=EOF)

46     {

47         if(n==0) break;

48         for(int i=0; i<n; i++)

49         {

50             cin>>a[i]>>str[i];

51         }

52         for(int i=0; i<n; i++)

53         {

54             for(int j=0; j<n; j++)

55             {

56                 if(i==j) g[i][j]=0;

57                 else g[i][j]=inf;

58             }

59         }

60         for(int i=0; i<n; i++)

61         {

62             for(int j=0; j<n; j++)

63             {

64                 if(i==j) continue;

65                 bool flag=false;

66                 int k=strlen(str[i]);

67                 for(int c=0; c<4; c++)

68                 {

69                     if(str[i][k+c-4]!=str[j][c])

70                     {

71                         flag=true;

72                         break;

73                     }

74                 }

75                 if(!flag)

76                 {

77                     g[i][j]=a[i];

78                 }

79             }

80         }

81         /*for(int i=0; i<n; i++)

82         {

83             for(int j=0; j<n; j++)

84             {

85                 printf("%d ",g[i][j]);

86             }

87             printf("\n");

88         }*/

89         spfa();

90         if(dis[n-1]==inf) printf("-1\n");

91         else printf("%d\n",dis[n-1]);

92     }

93     return 0;

94 }
View Code

 

你可能感兴趣的:(game)