이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include<fstream>
using namespace std;
ifstream fin("WINTER.inp");
ofstream fout("WINTER.out");
#define ll long long
#define pb push_back
#define forr(i, a, b) for(int i = a; i < b; i++)
#define dorr(i, a, b) for(int i = a; i >= b; i--)
#define ld long double
#define vt vector
#include<fstream>
#define fi first
#define se second
#define pll pair<ll, ll>
#define pii pair<int, int>
const ld PI = 3.14159265359;
const ll mod = 1e9 + 7;
const int mxn = 1e5, mxm = 2e5;
struct th{
int v, color, cost, id;
};
struct ch{
int s; ll d; int last;
};
struct cmp{
bool operator()(const ch &a, const ch &b){
return(a.d > b.d);
}
};
int n, m;
vt<th>adj[mxn + 1];
vt<ll>d[mxn + 1];
vt<int>edge[mxn + 1];
ll sm[mxm + 1];
int find(int u, int x){
if(x == 0)return(0);
return(lower_bound(edge[u].begin(), edge[u].end(), x) - edge[u].begin() + 1);
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
forr(i, 1, m + 1){
int a, b, c, p; cin >> a >> b >> c >> p;
adj[a].pb({b, c, p, i}); adj[b].pb({a, c, p, i});
edge[a].pb(i); edge[b].pb(i);
}
forr(i, 1, n + 1){
sort(edge[i].begin(), edge[i].end());
d[i].resize(edge[i].size() + 1);
for(int j = 0; j <= edge[i].size(); j++){
d[i][j] = 1e18;
}
}
priority_queue<ch, vt<ch>, cmp>pq;
d[1][0] = 0; pq.push({1, d[1][0], 0});
while(!pq.empty()){
auto [u, dd, last] = pq.top(); pq.pop();
if(d[u][find(u, last)] != dd)continue;
for(auto [v, color, cost, id]: adj[u]){
if(last == id)continue;
sm[color] += cost;
}
for(auto [v, color, cost, id]: adj[u]){
if(last == id)continue;
if(d[v][0] > dd + sm[color] - cost){
d[v][0] = dd + sm[color] - cost;
pq.push({v, d[v][0], 0});
}
int idv = find(v, id);
if(d[v][idv] > dd + cost){
d[v][idv] = dd + cost;
pq.push({v, d[v][idv], id});
}
}
for(auto [v, color, cost, id]: adj[u]){
sm[color] = 0;
}
}
ll res = 1e18;
for(int i = 0; i <=edge[n].size(); i++){
res = min(res, d[n][i]);
}
if(res == 1e18){
cout << -1;
}else{
cout << res;
}
return(0);
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'int main()':
Main.cpp:55:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
55 | for(int j = 0; j <= edge[i].size(); j++){
| ~~^~~~~~~~~~~~~~~~~
Main.cpp:65:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
65 | auto [u, dd, last] = pq.top(); pq.pop();
| ^
Main.cpp:67:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
67 | for(auto [v, color, cost, id]: adj[u]){
| ^
Main.cpp:71:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
71 | for(auto [v, color, cost, id]: adj[u]){
| ^
Main.cpp:85:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
85 | for(auto [v, color, cost, id]: adj[u]){
| ^
Main.cpp:90:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
90 | for(int i = 0; i <=edge[n].size(); i++){
| ~~^~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |