想看更多的解题报告: http://iyenn.com/rec/1824570.html
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:可以简单描述为知道从i到j的汇率,问能不能赚钱
解题思路:问能不能赚钱,就是当i到i初始是t时,从i到i的最长路径能不能大于t,如果有这样的情况就是能赚钱
- /*
- floyd
- Memory 196K
- Time 47MS
- */
- #include
- #include
- 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
- #include
- 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;
- }
评论记录:
回复评论: