ACM乐园
Love Me,Love My Code!
posts - 53,  comments - 24,  trackbacks - 0
http://acm.hdu.edu.cn/showproblem.php?pid=1217

这次是求最大汇率,不过不是加,是乘法。用floyd算法。
#include <iostream>
#include 
<string>

using namespace std;

const int M=31;
string  data[M];
double map[M][M];
//double dis[M][M];
//bool visit[M];
int n,m;

/*void dj(int i)
{
    int j,temp,k;
    double max;
    memset(visit,0,sizeof(visit));
    visit[i]=true;
    for(j=1;j<=n;j++)
        dis[i][j]=map[i][j];
    dis[i][i]=1;
    for(j=1;j<n;j++)
    {
        max=-1;
        for(k=1;k<=n;k++)
            if(!visit[k] && dis[i][k]>max)
            {
                max=dis[i][k];
                temp=k;
            }
        visit[temp]=true;
        for(k=1;k<=n;k++)
            if(!visit[k] && dis[i][k]<dis[i][temp]*map[temp][k])
                dis[i][k]=dis[i][temp]*map[temp][k];
    }
}
*/


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][j]<map[i][k]*map[k][j])
                    map[i][j]
=map[i][k]*map[k][j];
}


int main()
{
    
int i,pi,pj,t=1,j;
    
double price;
    
string a,b;
    
bool flag;
    
while(cin>>n,n)
    
{
        flag
=false;
        memset(map,
0,sizeof(map));
        
for(i=1;i<=n;i++)
            cin
>>data[i];
        cin
>>m;
        
while(m--)
        
{
            cin
>>a>>price>>b;
            pi
=pj=0;
            
for(i=1;i<=n;i++)
            
{
                
if(data[i]==a)
                    pi
=i;
                
if(data[i]==b)
                    pj
=i;
                
if(pi && pj) 
                    
break;
            }

            map[pi][pj]
=price;
        }

        
/*
        for(i=1;i<=n;i++)
            dj(i);
        for(i=1;i<=n && flag==false;i++)
            for(j=1;j<=n;j++)
                if(dis[i][j]*dis[j][i]>1)
                {
                    cout<<dis[i][j]*dis[j][i]-1<<endl;
                    flag=true;
                    break;
                }
        
*/

        floyd();
        
for(i=1;i<=n;i++)
            
if(map[i][i]>1)
            
{
                flag
=true;
                
break;
            }

        
if(flag)
            cout
<<"Case "<<t++<<": Yes\n";
        
else
            cout
<<"Case "<<t++<<": No\n";
    }

    
return 0;
}

上面注释的是我写的迪杰斯特拉算法,为什么是错的呢?以前也是这么写的,烦。。。。

posted on 2011-09-15 19:07 大大木马 阅读(366) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(1)

随笔档案(53)

文章档案(2)

搜索

  •  

积分与排名

  • 积分 - 63780
  • 排名 - 351

最新评论

阅读排行榜

评论排行榜