记录编号 466377 评测结果 WAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2014]魔法森林 最终得分 95
用户昵称 GravatarBaDBoY 是否通过 未通过
代码语言 C++ 运行时间 1.282 s
提交时间 2017-10-28 20:42:14 内存使用 82.00 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int read() {
	int s=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-') {
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		s=(s<<1)+(s<<3)+(ch^48);
		ch=getchar();
	}
	return s*f;
}
int r[50005],tot,bian[100005],size;
struct edge {
	int to,next,a,b;
} c[200005];
struct node {
	int x,y,a,b;
	friend bool operator < (node xx,node yy) {
		return xx.a<yy.a;
	}
} code[100005];
void add(int x,int y,int a,int b) {
	c[tot]=(edge) {
		y,r[x],a,b
	};
	r[x]=tot++;
}
int n,m,head,tail,queue[20000005],dis[50005];
bool flag[50005];
void spfa() {
	while(head<tail) {
		int u=queue[++head];
		flag[u]=false;
		for(int i=r[u]; ~i; i=c[i].next) {
			if(dis[c[i].to]>max(dis[u],c[i].b)) {
				dis[c[i].to]=max(dis[u],c[i].b);
				if(!flag[c[i].to]) {
					flag[c[i].to]=true;
					queue[++tail]=c[i].to;
				}
			}
		}
	}
	return ;
}
int ans=0x7fffffff;
int main() {
	freopen("magicalforest.in","r",stdin);
	freopen("magicalforest.out","w",stdout);
	n=read();
	m=read();
	memset(r,-1,sizeof(r));
	memset(dis,0x6f,sizeof(dis));
	for(int x,y,a,b,i=1; i<=m; i++) {
		code[i]=(node) {
			x=read(),y=read(),
			a=read(),b=read()
		};
		bian[i]=a;
	}
	size=unique(bian+1,bian+m+1)-bian-1;
	sort(bian+1,bian+size+1);
	sort(code+1,code+m+1);
	int i=1,j=1;
	dis[1]=0;
	for( ; i<=size; i++) {
		head=tail=0;
		//memset(flag,0,sizeof(flag));
		for( ; j<=m; j++) {
			if(bian[i]==code[j].a) {
				//cout<<i<<" "<<j<<endl;
				int x=code[j].x,y=code[j].y,a=code[j].a,b=code[j].b;
				add(x,y,a,b);
				add(y,x,a,b);
				queue[++tail]=x;
				queue[++tail]=y;
				flag[x]=flag[y]=true;
			}
			if(code[j].a>bian[i]) {
				//j--;
				break;
			}
		}
		spfa();
		ans=min(ans,dis[n]+bian[i]);
	}
	/*for(int i=1; i<=n; i++) {
		cout<<dis[i]<<endl;
	}*/
	/*if(ans==1869574000){
		cout<<"-1";
		return 0;
	}*/
	cout<<ans;
	return 0;
}