题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217
题目大意:通过货币的转换,来判断是否获利,如果获利则输出Yes,否则输出No。
这里介绍一个STL中的map容器去处理数据,map<string,int>V,M;
现在我目前的理解是将字符串转换成数字,然后就是根据spfa的模板找最短路了。。哇哈哈( ⊙o⊙ )哇

1 #include <iostream>
2 #include <cstdio>
3 #include <map>
4 #include <queue>
5 #include <cstring>
6 using namespace std;
7 int n,a;
8 double Map[35][35];
9 const int INF=9999;
10 map<string,int>V;
11
12 int spfa()
13 {
14 queue<int>q;
15 double node[35]= {0};
16 int inq[35]= {0};
17 node[1]=1;
18 inq[1]=1;
19 q.push(1);
20 while (!q.empty())
21 {
22 int s=q.front();
23 q.pop();
24 for (int i=1; i<=n; i++)
25 {
26 //cout<<Map[s][i]<<" "<<node[i]<<endl;
27 if (node[i]<Map[s][i]*node[s])
28 {
29 //cout<<node[i]<<" "<<Map[s][i]<<endl;
30 node[i]=Map[s][i]*node[s];
31 if (!inq[i])
32 {
33 q.push(i);
34 inq[i]=1;
35 }
36 if (node[1]>1)
37 return 1;
38 }
39
40 }
41 inq[s]=0;
42 }
43 return 0;
44 }
45 int main ()
46 {
47 char ch[35];
48 int cmp=1,q;
49 while (scanf("%d",&n),n)
50 {
51 q=0;
52 V.clear();
53 for (int i=1; i<=n; i++)
54 for (int j=1; j<=n; j++)
55 Map[i][j]=0;
56 //memset(Map,INF,sizeof(Map));
57 for (int i=1; i<=n; i++)
58 {
59 scanf("%s",ch);
60 if (!V[ch])
61 V[ch]=++q;
62 }
63 scanf("%d",&a);
64 for (int i=1; i<=a; i++)
65 {
66 double money;
67 char ch1[35],ch2[35];
68 scanf("%s%lf%s",ch1,&money,ch2);
69 if (Map[V[ch1]][V[ch2]]<money)
70 Map[V[ch1]][V[ch2]]=money;
71 //cout<<Map[V[ch1]][V[ch2]]<<endl;
72 }
73 printf ("Case %d: ",cmp++);
74 if (spfa())
75 printf("Yes\n");
76 else
77 printf ("No\n");
78 }
79 return 0;
80 }
来源:https://www.cnblogs.com/qq-star/p/3913367.html
