POJ2240Arbitrage

题意应该很好理解,就不赘述了.
这道题是一道判正环的题
思路很简单,用floyd或者spfa判断一下是否存在正环就好了.因为我比较熟练floyd所以用了floyd.
开始给mapp[i][i]全都赋值1;
最后判断mapp[i][i]是否大于1就行.
要注意的是这里用了map,最开始没用,只是单纯用了数组来存,然后每次n重循环找s1,s2再给mapp[s1][s2]赋值,后来TLE了,才;;用了map
map是很好的将字符串作为数组名存储的工具.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
double mapp[40][40];
string s[40];
	int n;
const int INF=0;
map<string,int>m;
void floyd()
{   int se = 0;
	for(int k = 1;k <= n ;k ++)
	 for(int j = 1;j <= n ;j ++)
	  for(int i = 1;i <= n ;i ++)
	   if(mapp[j][i]<mapp[j][k]*mapp[k][i] )
	     mapp[j][i] = mapp[j][k]*mapp[k][i];
    
	for(int k = 1;k <= n ;k ++)
	   if(mapp[k][k]>1)
	    {se = 1;
	     break;
		}
	if(se == 1) cout<<"Yes"<<endl;
	else cout<<"No"<<endl;

}
int main(){

	int Case = 1; 
	while(scanf("%d",&n)&&n)
    {   
    	for(int i = 1;i <= n;i++)
    	{
    		cin>>s[i];
    		m.insert(make_pair(s[i],i));
        mapp[i][i]= 1;
		}
		int x;
    	scanf("%d",&x);
    	for(int i = 1;i <= x;i++)
	     {  int p ,q;
	     	string s1,s2;
	     	double d;
	        cin>>s1>>d>>s2;
		    mapp[m[s1]][m[s2]] = d;
		 }
		 cout<<"Case "<<Case<<": ";
		 floyd();
	     Case++;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值