POJ2240Arbitrage SPFA+鄰接矩陣

坑爹的題,讀了好半天才讀懂,以爲spfa+鄰接矩陣就可以秒的,但是一直wa,

調了一個小時才發現,map數組開成int型了,導致精度損失,連樣例都沒過,

第二個錯誤是數組開小了,題上說30,我就真的狠耿直的吧數組範圍開到30了,

蛋疼,改到35就過了

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define INF 0x7f
#define maxn 35
double dist[maxn];
double map[maxn][maxn];
int n,m;
char name[maxn][1000];
int flag;
bool vis[maxn];
void spfa(int s)
{
    memset(vis,0,sizeof(vis));
    int i;
    for(i=1;i<=n;i++)
    dist[i]=0;
    dist[s]=1;
    queue<int>q;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=false;
        //cout<<u<<endl;
        for(i=1;i<=n;i++)
        {
            //cout<<map[u][2]<<" "<<dist[2]<<" "<<dist[u]*map[u][2]<<endl;
            if(map[u][i]!=0&&dist[i]<dist[u]*map[u][i])
            {
                //cout<<u<<" "<<i<<" "<<map[u][i]<<endl;
                dist[i]=dist[u]*map[u][i];
                if(!vis[i])
                {
                    vis[i]=true;
                    q.push(i);
                }
            }
        }
    }
    if(dist[s]>1) flag=1;
}
int main()
{
    int i,j;
    double num;
    int kase=0;
    char str[1000],str1[1000];
    while(cin>>n)
    {
        if(n==0) break;
        flag=0;
        for(i=1;i<=n;i++)
        {
            scanf("%s",name[i]);
        }
        cin>>m;
        memset(map,0,sizeof(map));
        for(int k=1;k<=m;k++)
        {
            scanf("%s %lf %s",str,&num,str1);
            for(i=1;strcmp(name[i],str);i++);
            for(j=1;strcmp(name[j],str1);j++);
            map[i][j]=num;
        }
        for(i=1;i<=n;i++)
        {
            spfa(i);
            if(flag) break;
        }
        if(flag) printf("Case %d: Yes\n",++kase);
        else printf("Case %d: No\n",++kase);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章