比赛 防止浮躁的小练习V0.1 评测结果
题目名称 上学路线 最终得分 20
用户昵称 Ostmbh 运行时间 0.207 s
代码语言 C++ 内存使用 6.03 MiB
提交时间 2016-10-07 19:24:02
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX=500+10;
int dis[MAX];
int vis[MAX]={0};
const int MAXD=124750+10;
struct Edge{
	int f,t,v,c,next,used;
	bool operator<(const Edge& a)const{
		return c<a.c;
	}
	Edge(){
		next=0;
	}
}E[MAXD*2];
int head[MAX]={0};
int dis1[MAX];
priority_queue<Edge>pq;
queue<int>q;
int n,m;
int edge=1;
inline void addedge(int x,int y,int c,int d){
	E[edge].f=x,E[edge].t=y,E[edge].v=c,E[edge].c=d,E[edge].next=head[x],head[x]=edge++;
	E[edge].f=y,E[edge].t=x,E[edge].v=c,E[edge].c=d,E[edge].next=head[y],head[y]=edge++;
}
inline void init(){
	scanf("%d %d",&n,&m);
	int x,y,z,d;
	for(int i=1;i<=m;i++){
		scanf("%d %d %d %d",&x,&y,&z,&d);
		addedge(x,y,z,d);
	}
}
inline void spfa(){
	memset(dis,127/2,sizeof(dis));
	dis[1]=0;
	vis[1]=1;
	q.push(1);
	while(!q.empty()){
		int cd=q.front();
		q.pop();
		for(int i=head[cd];i;i=E[i].next){
			int u=E[i].t;
			if(dis[u]>dis[cd]+E[i].v){
				dis[u]=dis[cd]+E[i].v;
				if(!vis[u]){
					vis[u]=1;
					q.push(u);
				}
			}
		}
		vis[cd]=0;
	}
	printf("%d\n",dis[n]);
}
inline void solve(){
	memset(dis1,127/2,sizeof(dis1));
	dis1[1]=0;
	vis[1]=1;
	q.push(1);
	while(!q.empty()){
		int cd=q.front();
		q.pop();
		for(int i=head[cd];i;i=E[i].next){
			int u=E[i].t;
			if(dis1[u]>dis1[cd]+E[i].v){
				dis1[u]=dis1[cd]+E[i].v;
				if(dis1[u]==dis[u])
					E[i].used=1;
				if(!vis[u]){
					vis[u]=1;
					q.push(u);
				}
			}
		}
	}
	for(int i=1;i<=m*2;i+=2){
		if(E[i].used||E[i+1].used)
			E[i+1].used=1;
		pq.push(E[i]);
	}
	while(!pq.empty()){
		Edge cd=pq.top();
		pq.pop();
		
	}
}
inline void work(){
	spfa();
	//solve();
}
int main(){
	freopen("routez.in","r",stdin);
	freopen("routez.out","w",stdout);
	init();
	work();
return 0;
}