Submission #469682

#TimeUsernameProblemLanguageResultExecution timeMemory
469682MohamedAliSaidaneRobot (JOI21_ho_t4)C++14
0 / 100
103 ms18516 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; typedef vector<int> vi; typedef long long ll; typedef pair<ll,ll> pll; typedef tuple<int,int,int> ti; typedef unsigned long long ull; typedef long double ld; typedef vector<ll> vll; typedef pair<ld,ld> pld; #define pb push_back #define popb pop_back() #define pf push_front #define popf pop_front #define ff first #define ss second #define MOD (int)(1e8) #define INF (ll) (1e18) #define all(v) (v).begin(),(v).end() ll gcd(ll a , ll b) {return b ? gcd(b , a % b) : a ;} ll lcm(ll a , ll b) {return (a * b) / gcd(a , b);} ld pointdist(ld x, ld y, ld point) { return ((x-point)*(y-point))/abs(x-y); } //ld dist(ld x, ld y, ld a, ld b){ return sqrt((x-a)*(x-a) + (y-b)*(y-b)); } const int nx[8] = {0, 0, 1, -1,1,1,-1,-1}, ny[8] = {1, -1, 0, 0,1,-1,1,-1}; //East, West, South, North+ ////////////******SOLUTION******\\\\\\\\\\\ const int MAX_N = 1e5 + 4; const int MAX_M = 2e5 + 4; pll edges[MAX_N]; vector<pair<pll,int>> adj[MAX_N]; int n, m; bool visited[MAX_N]; ll dist[MAX_N]; void dfs(int x) { visited[x] = true; map<int,int> m; map<ll,ll> sm; for(auto e: adj[x]) { int col = edges[e.ff.ss].ff; m[col] ++; sm[col] += edges[e.ff.ss].ss; if(visited[e.ff.ff]) continue; dfs(e.ff.ff); } for(auto e: adj[x]) { int col = edges[e.ff.ss].ff; if(m[col] == 1) e.ss = 1; } } ll dijkstra(int x) { set<pll> pq; pq.insert({0,x}); while(!pq.empty()) { pll pr = *(pq.begin()); ll node = pr.ss; ll d = pr.ff; pq.erase(pq.begin()); dist[node] = d; visited[node] = true; if(node == n) return d; for(auto e: adj[node]) { if(visited[e.ff.ff]) continue; if(e.ss) { if(dist[e.ff.ff] > d) { dist[e.ff.ff] = d; pq.insert({d,e.ff.ff}); } } else { if(dist[e.ff.ff] > d+edges[e.ff.ss].ss) { dist[e.ff.ff] = d+edges[e.ff.ss].ss; pq.insert({d+edges[e.ff.ss].ss,e.ff.ff}); } } } } return 69; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 0; i <m; i ++) { ll a, b, c, p; cin >> a >> b >> c >> p; adj[a].pb({{b,i},0}); adj[b].pb({{a,i},0}); edges[i] = {c,p}; } dfs(1); if(!visited[n]) { cout << -1; exit(0); } memset(visited,false,sizeof(visited)); for(int i = 2; i <=n; i ++) dist[i] = INF; dist[1] = 0; cout << dijkstra(1); } /* Identify problem diagram: Brute force, Greedy, Dynamic Programming, Divide and Conquer Reformulate the problem into something more theoretical !!!!! IMPLICIT GRAPH ?????? !!!!! PAY ATTENTION TO THE CONSTRAINTS: DP nD ? BF ? BITMASKING ? !!!!! SOLVE THE SUBTASKS FIRST: IT'S TOTALLY OK NOT TO SOLVE THE PROBLEM ENTIRELY Search for multiple approaches: select the seemingly optimal one Remember that you're the king of CP Change your approach Imagine Corner cases before submitting Don't spend too much time on the problem: move on ! */

Compilation message (stderr)

Main.cpp:26:1: warning: multi-line comment [-Wcomment]
   26 | ////////////******SOLUTION******\\\\\\\\\\\
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...