Submission #1294096

#TimeUsernameProblemLanguageResultExecution timeMemory
1294096tunademayoRobot (JOI21_ho_t4)C++20
100 / 100
89 ms15048 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long 
#define fi first
#define se second

const bool Multitest = 0, Local = 0;
const int N = 2e5 + 10;

int n, m; 
vector<pair<int, pair<int, int>>> adj[N];
ll d[N], s[N], mi[N]; bitset<N> vis;

struct Data
{
	int u; ll w;
	
	Data( ) { }
	Data(int _u, ll _w) : u(_u), w(_w) { }
}; 
#define Push(u, w) push(Data(u, w))
struct cmp
{
	bool operator () (Data a, Data b)
	{
		return a.w > b.w;
	}
};

void work()
{
	cin >> n >> m;
	
	for(int i = 1 ; i <= m ; i++)
	{
		int u, v, c, w;	cin >> u >> v >> c >> w;
		adj[u].push_back({v, {c, w}});
		adj[v].push_back({u, {c, w}});
	}
	
	for(int i = 1 ; i <= n ; i++) d[i] = 1e18;
	for(int i = 1 ; i <= m ; i++) mi[i] = 1e18;
	priority_queue<Data, vector<Data>, cmp> q;
	q.Push(1, 0); d[1] = 0;
	
	while(!q.empty())
	{
		Data x = q.top(); q.pop();
		
		if(vis[x.u]) continue;
		vis[x.u] = 1;
		
//		cerr << x.u << ' ' << x.w << '\n';
		
		for(int i = 0 ; i < adj[x.u].size() ; i++)
		{
			int v = adj[x.u][i].fi, c = adj[x.u][i].se.fi, w = adj[x.u][i].se.se;
			s[c] += w;
		}
		
		for(int i = 0 ; i < adj[x.u].size() ; i++)
		{
			int v = adj[x.u][i].fi, c = adj[x.u][i].se.fi, w = adj[x.u][i].se.se;
			mi[c] = min(mi[c], d[v] + s[c]);
		}
		
		for(int i = 0 ; i < adj[x.u].size() ; i++)
		{
			int v = adj[x.u][i].fi, c = adj[x.u][i].se.fi, w = adj[x.u][i].se.se;
			
			ll val = x.w + min((ll)w, s[c] - w);
			val = min(val, mi[c] - w);
			
			if(d[v] > val)
			{
				d[v] = val;
				q.Push(v, d[v]);
			}
		}
		
		for(int i = 0 ; i < adj[x.u].size() ; i++)
		{
			int v = adj[x.u][i].fi, c = adj[x.u][i].se.fi, w = adj[x.u][i].se.se;
			s[c] = 0, mi[c] = 1e18;
		}
	}
	
	cout << (d[n] == 1e18 ? -1 : d[n]);
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);	cout.tie(0);
	
	if(Local && fopen("code.inp", "r"))
	{
		freopen("code.inp", "r", stdin);
		freopen("code.out", "w", stdout);
	}
	
	int q = 1;
	
	if(Multitest) cin >> q;
	
	while(q--) work();
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:99:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |                 freopen("code.inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:100:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  100 |                 freopen("code.out", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...