又是好久没写博客了。。
今年基本上是参加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;
}