想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:可以简单描述为知道从i到j的汇率,问能不能赚钱
解题思路:问能不能赚钱,就是当i到i初始是t时,从i到i的最长路径能不能大于t,如果有这样的情况就是能赚钱
/*
floyd
Memory 196K
Time 47MS
*/
#include <iostream>
#include <string.h>
using namespace std;
#define MAXC 100
#define MAXV 50
double map[MAXV][MAXV];
int n,m;
void Input(){
char s[MAXV][MAXC],a[MAXC],b[MAXC];
int i,k,j;
double c;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
if(i==j)
map[i][j]=1;
else
map[i][i]=0;
for(i=1;i<=n;i++) scanf("%s",s[i]);
scanf("%d\n",&m);
for(i=1;i<=m;i++){
scanf("%s %lf %s",a,&c,b);
for(j=1;j<=n;j++)
if(!strcmp(s[j],a)) break;
for(k=1;k<=n;k++)
if(!strcmp(s[k],b)) break;
map[j][k]=c;
}
}
void floyd(){
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][k]*map[k][j]>map[i][j])
map[i][j]=map[i][k]*map[k][j];
}
int main(){
int cas=1,i;
while(scanf("%d\n",&n) && n){
Input();
floyd();
printf("Case %d: ",cas++);
for(i=1;i<=n;i++)
if(map[i][i]>1) break;
if(i>n) printf("No\n");
else printf("Yes\n");
}
return 0;
}
===========================================================================================
/*
bellman-ford
Memory 196K
Time 47MS
*/
#include <iostream>
#include <string.h>
using namespace std;
#define MAXC 100
#define MAXV 50
#define MAXM 10000
typedef struct{
int a,b;
double rate;
}Edge;
Edge edge[MAXM];
int n,m;
void Input(){
char s[MAXV][MAXC],a[MAXC],b[MAXC];
int i,k,j;
for(i=1;i<=n;i++) scanf("%s",s[i]);
scanf("%d\n",&m);
for(i=1;i<=m;i++){
scanf("%s %lf %s",a,&edge[i].rate,b);
for(j=1;j<=n;j++)
if(!strcmp(s[j],a)) break;
for(k=1;k<=n;k++)
if(!strcmp(s[k],b)) break;
edge[i].a=j;
edge[i].b=k;
}
}
int bellman_ford(){
int i,j;
double d[MAXV];
for(i=1;i<=n;i++) d[i]=0;
d[1]=1;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
if(d[edge[j].a]*edge[j].rate>d[edge[j].b])
d[edge[j].b]=d[edge[j].a]*edge[j].rate;
}
for(j=1;j<=m;j++)
if(d[edge[j].a]*edge[j].rate>d[edge[j].b])
return 1;
return 0;
}
int main(){
int cas=1,i;
while(scanf("%d\n",&n) && n){
Input();
printf("Case %d: ",cas++);
if(!bellman_ford()) printf("No\n");
else printf("Yes\n");
}
return 0;
}