제출 #1340988

#제출 시각아이디문제언어결과실행 시간메모리
1340988yus1f_m사이버랜드 (APIO23_cyberland)C++20
15 / 100
38 ms10664 KiB
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#include "cyberland.h"
const long long sz=1000000,INF=1000000000000000000;
using namespace std;
int res;
double ans;
vector<int>nodes;
vector<long double>dist;
vector<bool>isSeen,IsSeen;
vector<vector<int>>Nums;
vector<vector<pair<int,int>>>nums;
void bfs(int num)
{
    queue<int>numS;
    numS.push(num);
    IsSeen[num]=true;
    while(numS.size()!=0)
    {
        res=numS.front();
        numS.pop();
        for(int i=0;i<Nums[res].size();i++)
        {
            if(!IsSeen[Nums[res][i]])
            {
                numS.push(Nums[res][i]);
                IsSeen[Nums[res][i]]=true;
            }
        }
    }
}
void dijkstra()
{
    priority_queue<pair<long double,int>,vector<pair<long double,int>>,greater<pair<long double,int>>>pq;
    for(int i=0;i<nodes.size();i++)
    {
        pq.push({0.0,nodes[i]});
        dist[nodes[i]]=0.0;
    }
    while(pq.size()!=0)
    {
        res=pq.top().second;
        pq.pop();
        if(!isSeen[res])
        {
            isSeen[res]=true;
            for(int i=0;i<nums[res].size();i++)
            {
                if(dist[res]+nums[res][i].second<dist[nums[res][i].first])
                {
                    pq.push({dist[res]+nums[res][i].second,nums[res][i].first});
                    dist[nums[res][i].first]=dist[res]+nums[res][i].second;
                }
            }
        }
    }
}
double solve(int n,int m,int l,int p,vector<int>nums1,vector<int>nums2,vector<int>nums3,vector<int>nums4)
{
    nums.clear(),Nums.clear(),dist.clear(),nodes.clear(),isSeen.clear(),IsSeen.clear(),nums.resize(n+1),Nums.resize(n+1),dist.resize(n+1),isSeen.resize(n+1),IsSeen.resize(n+1),fill(dist.begin(),dist.end(),1.0*INF),fill(isSeen.begin(),isSeen.end(),false),fill(IsSeen.begin(),IsSeen.end(),false);
    for(int i=0;i<nums1.size();i++)
    {
        nums[nums1[i]].push_back({nums2[i],nums3[i]}),nums[nums2[i]].push_back({nums1[i],nums3[i]}),Nums[nums1[i]].push_back(nums2[i]),Nums[nums2[i]].push_back(nums1[i]);
    }
    bfs(0),nodes.push_back(0);
    for(int i=1;i<n;i++)
    {
        if(i!=p && nums4[i]==0 && IsSeen[i])
        {
            nodes.push_back(i);
        }
    }
    dijkstra();
    ans=1.0*dist[p];
    if(dist[p]==1.0*INF)
    {
        ans=-1.0;
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...