又是好久没写博客了。。

今年基本上是参加acm的最后一年了,一定要把写博客的习惯坚持下来!最近一直在看最短路和最小生成树的题目!以前只是看过代码,然后自己有了一个自己的模版!

别人有时说关于这样的题目用prim,floyd什么样的算法,感觉自己不会,就会我自己的那种!

近来没事,想起了这个问题,就决定了解透彻,就从《实用算法分析与程序设计》这本书上找到了答案,才发现原来我自己的算法算得上是prim,原来我一直感觉最短路和最小生成树都可以那种方法,事实上也差不多,像dijkst和prim的确很相似!又从书上看到了另外一种求最短路的方法---floyd;   感觉这种算法比较好,对于数据量比较小的这种方法最合适了, 特别是回溯的时候!

hdu上的这道题一开始知道是用这个floyd,只不过最后求结果时没处理好!不过我感觉和这种方法比,没什么差别,至今还想到原来的是什么地方出错^--^

题目大意就是汇率的转换问题!问通过很多种货币的转化,看最后会不会有一些利润!应该算是最长路,代码如下:

# include<stdio.h>
# include
<string.h>
int n;
double adj[35][35];
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(adj[i][j]< adj[i][k]*adj[k][j]) adj[i][j]=adj[i][k]*adj[k][j];
}
}
}
}
int main()
{
int m,i,j,num=0,flag;
double ans;
char str[35][30],st1[30],st2[30];
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
num
++;
getchar();
memset(adj,
0,sizeof(adj));
for(i=1;i<=n;i++)
gets(str[i]);
scanf(
"%d",&m);
while(m--)
{
getchar();
scanf(
"%s %lf %s",st1,&ans,st2);
for(i=1;i<=n;i++)
if(strcmp(st1,str[i])==0) break;
for(j=1;j<=n;j++)
if(strcmp(st2,str[j])==0) break;
adj[i][j]
=ans;
}
floyd();
flag
=0;
for(j=1;j<=n;j++)
{
if(adj[j][j]>1) {flag=1;break;}
}
printf(
"Case %d: ",num);
if(flag==0) printf("No\n");
else printf("Yes\n");
}
return 0;
}
posted on 2011-03-11 18:51  奋斗青春  阅读(516)  评论(0编辑  收藏  举报