ROUTING 질문입니다.

  • ados
    ados

    안녕하세요.

    JMBook으로 열심히 공부 중인 초짭니다.

    책에 설명된 알고리즘과 거의 같게
    작성한거 같은데 계속 오답으로 나옵니다.
    예제는 답이 제대로 나와서,
    실수 오차때문인가 해서 long double로 바꿔 봤는데도 소용이 없네요.
    어디가 문제인지 짚어 주시면 정말 감사하겠습니다.

    #include <iostream>
    #include <iomanip>
    #include <vector>
    #include <queue>
    
    using namespace std;
    
    #define REP(i,n) for(int i=0; i<n; ++i)
    #define INF 987654321
    
    int N, M;
    
    long double calcNoise(int src, vector<vector<pair<int,long double> > >& graph)
    {
        vector<long double> dist(N, INF);
        dist[src] = 1.0;
    
        priority_queue<pair<long double,int>, vector<pair<long double,int> >, greater<pair<long double,int> > > pq;
    
        pq.push(make_pair(1.0, src));
    
        while(!pq.empty())
        {
            long double cost = pq.top().first;
            int here = pq.top().second;
            pq.pop();
    
            if(dist[here] < cost) continue;
    
            int size = graph[here].size();      
            REP(i,size)
            {
                int there = graph[here][i].first;
                long double nextCost = cost * graph[here][i].second;
    
                if(dist[there] > nextCost)
                {
                    dist[there] = nextCost;
                    pq.push(make_pair(nextCost,there));
                }
            }
        }
    
        return dist[N-1];
    }
    
    int main(void)
    {
        int t;
        cin >> t;
        cout << fixed << setprecision(10);
        while(t--)
        {
            cin >> N >> M;
    
            vector<vector<pair<int,long double> > > graph(N);
    
            int a, b;
            long double c;
    
            REP(i,M)
            {
                cin >> a >> b >> c;
                graph[a].push_back(make_pair(b,c));
            }
    
            cout << calcNoise(0, graph) << endl;
        }
    }
    


    11년 전
4개의 댓글이 있습니다.
  • kcm1700
    kcm1700

    입력으로 들어오는 회선은 양방향인데 한 방향만 추가하셨네요.


    11년 전 link
  • ados
    ados

    감사합니다. 맞는 지적이신데,
    cin >> a >> b >> c;
    graph[a].push_back(make_pair(b,c));
    graph[b].push_back(make_pair(a,c));
    마지막 줄을 추가했는데도 오답이 뜨네요. OTL


    11년 전 link
  • kcm1700
    kcm1700

    INF가 너무 작지 않을까요?


    11년 전 link
  • ados
    ados

    감사합니다. numeric_limits의 max()를 사용하니, 통과했습니다.^^
    아직 감이 없다 보니, 왠만하면 numeric_limits를 이용해야 겠습니다.


    11년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.