제출 #1045503

#제출 시각아이디문제언어결과실행 시간메모리
1045503vjudge1Olympic Bus (JOI20_ho_t4)C++14
32 / 100
495 ms4808 KiB
#include <bits/stdc++.h>
using namespace std;
inline long long read(){
	long long c=1,f=0;char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			c=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		f=f*10+(ch-'0');
		ch=getchar();
	}
	return c*f;
}
inline void write(__int128 x){
	if(x<0){
		putchar('-');
		x=-1*x;
	}
	if(x>9){
		write(x/10);
	}
	putchar('0'+x%10);
	return;
}
struct node{
	long long id;
	long long d;
	bool operator > (node b)const{
		return d>b.d;
	}
}; 
priority_queue<node,vector<node>,greater<node> >q;
long long n,m,w[50005],ne[50005],h[205],tot,d[50005],f[205],g[205]; 
long long w1[50005],ne1[50005],h1[205],tot1,d1[50005],v[50005];
long long pref[205],preg[205],ans[50005],dis1[205],dis2[205],minn;
bool vis[50005],flag[205],isok[205];
void add(long long a,long long b,long long c){
	w[++tot]=b;
	d[tot]=c;
	ne[tot]=h[a];
	h[a]=tot;
	return;
}
void add1(long long a,long long b,long long c){
	w1[++tot1]=b;
	d1[tot1]=c;
	ne1[tot1]=h1[a];
	h1[a]=tot1;
	return;
}
void dijstra(long long u){
	for(int i=1;i<=n;i++){
		f[i]=1e18;
		flag[i]=false;
	}
	f[u]=0;
	node temp;
	temp.id=u;
	temp.d=0;
	q.push(temp);
	while(!q.empty()){
		node p=q.top();
		q.pop();
		if(flag[p.id]){
			continue;
		}
		flag[p.id]=true;
		for(int i=h[p.id];i;i=ne[i]){
			if(isok[i]){
				continue;
			}
			temp.id=w[i];
			temp.d=p.d+d[i];
			if(f[temp.id]>temp.d){
				f[temp.id]=temp.d;
				pref[temp.id]=i;
				q.push(temp);
			}
		}
	}
	return;
}
void dijstra1(long long u){
	for(int i=1;i<=n;i++){
		g[i]=1e18;
		flag[i]=false;
	}
	g[u]=0;
	node temp;
	temp.id=u;
	temp.d=0;
	q.push(temp);
	while(!q.empty()){
		node p=q.top();
		q.pop();
		if(flag[p.id]){
			continue;
		}
		flag[p.id]=true;
		for(int i=h1[p.id];i;i=ne1[i]){
			if(isok[i]){
				continue;
			}
			temp.id=w1[i];
			temp.d=p.d+d1[i];
			if(g[temp.id]>temp.d){
				g[temp.id]=temp.d;
				preg[temp.id]=i;
				q.push(temp);
			}
		}
	}
	return;
}
int main(){
//	freopen("sets.in","r",stdin);
//	freopen("sets.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	n=read();m=read();
	for(int i=1;i<=m;i++){
		long long a,b,c;
		a=read();b=read();c=read();v[i]=read();
		add(a,b,c);
		add1(b,a,c);
	}
	dijstra(1);
	dijstra1(n);
	minn=f[n];
	for(int i=1;i<=n;i++){
		dis1[i]=f[i];dis2[i]=g[i];
	}
	for(int i=1;i<=n;i++){
		vis[pref[i]]=vis[preg[i]]=true;
	}
	for(int i=1;i<=n;i++){
		for(int j=h[i];j;j=ne[j]){
			if(vis[j]==false){
				ans[j]=min(dis1[w[j]]+dis2[i]+d[j],dis1[n]);
			}
			else{
				isok[j]=true;
				add(w[j],i,d[j]);
				dijstra(1);
				h[w[j]]=ne[tot];
				tot--;
				isok[j]=false;
				ans[j]=f[n];
			}
		}
	}
	memset(vis,false,sizeof(vis));
	memset(pref,0,sizeof(pref));
	memset(preg,0,sizeof(preg));
	dijstra(n);
	dijstra1(1);
	minn+=f[1];
	for(int i=1;i<=n;i++){
		dis1[i]=f[i];dis2[i]=g[i];
	}
	for(int i=1;i<=n;i++){
		vis[pref[i]]=vis[preg[i]]=true;
	}
	for(int i=1;i<=n;i++){
		for(int j=h[i];j;j=ne[j]){
			if(vis[j]==false){
				ans[j]+=min(dis1[w[j]]+dis2[i]+d[j],dis1[1]);
			}
			else{
				isok[j]=true;
				add(w[j],i,d[j]);
				dijstra(n);
				h[w[j]]=ne[tot];
				tot--;
				isok[j]=false;
				ans[j]+=f[1];
			}
		}
	}
	for(int i=1;i<=m;i++){
		minn=min(minn,ans[i]+v[i]);
	}
	if(minn>=1e18){
		minn=-1;
	}
	printf("%lld",minn);
//	fclose(stdin);
//	fclose(stdout);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...