比赛 |
防止浮躁的小练习V0.1 |
评测结果 |
PPPPPPPPPP |
题目名称 |
上学路线 |
最终得分 |
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;
}