제출 #1149782

#제출 시각아이디문제언어결과실행 시간메모리
1149782murpylRobot (JOI21_ho_t4)C++20
100 / 100
752 ms82612 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
using ll = long long;
using vi = vector<int>;
#define pb push_back
#define rsz resize
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
using pi = pair<int,int>;
#define endl "\n"
#define mp make_pair
void setIO(string name = "") {
	ios_base::sync_with_stdio(0); cin.tie(0);
	if(sz(name)){
		freopen((name+".in").c_str(), "r", stdin); 
		freopen((name+".out").c_str(), "w", stdout);
	}
}

const int maxn = 1e5+10;
const int maxm = 2e5+10;
const int INF = 1e18;
int n,m;
struct Edge{
    int to, color, price;
};
// vector<Edge> adj[maxn];
// int colorsum[maxn][maxm];
// int dist2[maxn][maxm];

map<int, vector<Edge>> adj[maxn];
map<int, int> colorsum[maxn];
map<int, int> dist2[maxn];

signed main(){
    setIO();
    cin>>n>>m;
    for (int i = 0; i < m; i++){
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        a--; b--;
        adj[a][c].pb({b, c, d});
        adj[b][c].pb({a, c, d});
        colorsum[a][c] += d;
        colorsum[b][c] += d;
    }
    
    vi dist(n, INF);    
    dist[0] = 0;
    priority_queue<pair<int, pi>, vector<pair<int, pi>>, greater<pair<int, pi>>> pq;
    pq.push({0, {0, 0}});
    while (!pq.empty()){
        auto [d, node] = pq.top();
        pq.pop();
        auto [cur, color] = node;
        if (color){
            if (dist2[cur][color] < d) continue;
            for (auto e : adj[cur][color]){
                int case1 = d+colorsum[cur][e.color]-e.price;
                if (case1 < dist[e.to]){
                    dist[e.to] = case1;
                    pq.push({case1, {e.to, 0}});
                }

            }
        }
        else{
            if (dist[cur] < d) continue; 
            for (auto i : adj[cur]){
                for (Edge e: i.second){
                    int case1 = d + colorsum[cur][e.color] - e.price;
                    //flip all others
                    if (case1 < dist[e.to]){
                        dist[e.to] = case1;
                        pq.push({case1, {e.to,0 }});
                    }
                    
                    int case2 = d + e.price;
                    //flip this one
                    if (case2 < dist[e.to]){
                        dist[e.to] = case2;
                        pq.push({case2, {e.to, 0}});
                    }
                    int case3 = d;
                    if (!dist2[e.to].count(e.color) || case3 < dist2[e.to][e.color]){
                        dist2[e.to][e.color] = case3;
                        pq.push({case3, {e.to, e.color}});
                    }

                }
            }
        }
    }

    if (dist[n-1] == INF){
        cout<<-1<<endl;
    } else {
        cout<<dist[n-1]<<endl;
    }
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'void setIO(std::string)':
Main.cpp:16:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |                 freopen((name+".in").c_str(), "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:17:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |                 freopen((name+".out").c_str(), "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...