记录编号 203670 评测结果 AAAAA
题目名称 平凡的皮卡丘 最终得分 100
用户昵称 Gravatar321Rain 是否通过 通过
代码语言 C++ 运行时间 0.297 s
提交时间 2015-11-03 14:41:26 内存使用 11.44 MiB
显示代码纯文本
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 101000
#define MAXC 401000
using namespace std;
struct Node{int from,to,next,data;}edge[MAXN<<1],N_edge[MAXN<<1];
int head[MAXC],f[MAXC],pre[MAXC];
bool vis[MAXC];
int edgenum,N_edgenum;
int n,m;
inline void add(int x,int y,int data){
	edgenum++;
	edge[edgenum].next=head[x];
	edge[edgenum].to=y;
	edge[edgenum].data=data;
	head[x]=edgenum;
	return ;
}
inline void spfa(void){
	memset(f,0x7f7f7f7f,sizeof f);
	memset(vis,0,sizeof vis);
	queue<int> q;
	q.push(1);
	vis[1]=1;
	f[1]=0;
	while(!q.empty()){
		int fr=q.front();
		q.pop();
		vis[fr]=0;
		for(int i=head[fr];i!=-1;i=edge[i].next){
			int to=edge[i].to;
			if(f[to]>f[fr]+edge[i].data){
				f[to]=f[fr]+edge[i].data;
				if(fr==1)
					pre[to]=to;
				else
					pre[to]=pre[fr];
				if(!vis[to]){
					vis[to]=1;
					q.push(to);
				}
			}
		}
	}return ;
}
inline void N_add(int x,int y,int data){
	N_edgenum++;
	N_edge[N_edgenum].from=x;
	N_edge[N_edgenum].to=y;
	N_edge[N_edgenum].data=data;
	return ;
} 
int main(){
	freopen("both.in","r",stdin);
	freopen("both.out","w",stdout);
	scanf("%d%d",&n,&m);
	memset(head,-1,sizeof head);
	for(int i=0,u,v,w,y;i<m;i++){
		scanf("%d%d%d%d",&u,&v,&w,&y);
		add(u,v,w);
		add(v,u,y);
	}spfa();
	for(int i=1;i<=n;i++){
		for(int j=head[i];j!=-1;j=edge[j].next){
			int to=edge[j].to;
			if(to==1){
				if(pre[i]!=i)
					N_add(1,n+1,edge[j].data+f[i]);
				else
					N_add(i,n+1,edge[j].data);
			}else{
				if(i==1){
					int vv=edge[j].to;
					if(pre[vv]==vv)
						continue ;
					N_add(1,vv,edge[j].data);
				}else{
					int vv=edge[j].to;
					if(pre[i]==pre[vv])
						N_add(i,vv,edge[j].data);
					else
						N_add(1,vv,f[i]+edge[j].data);
				}
			}
		}
	}edgenum=0;
	memset(head,-1,sizeof head);
	for(int i=1;i<=N_edgenum;i++){
		add(N_edge[i].from,N_edge[i].to,N_edge[i].data);
	}spfa();
	int ans=f[n+1];
	if(ans==0x7f7f7f7f)
		ans=-1;	
	printf("%d",ans);
	return 0;
}