记录编号 436122 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2014]魔法森林 最终得分 100
用户昵称 Gravatarhunter 是否通过 通过
代码语言 C++ 运行时间 1.154 s
提交时间 2017-08-11 07:12:38 内存使用 3.42 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define maxn 50005
using namespace std;
int n,m;
int dis[maxn];
struct edge2
{
    int fr,to,a,b;  
}s[maxn*2];
int kk=0;
struct edge
{
      int to,ne,w;
}b[maxn*2];
int k=0,head[maxn];
bool vis[maxn];
struct node
{
     int id; 
     bool operator <(const node &a)
     const { 
         return dis[id]>dis[a.id];
     }
}tmp,now;
priority_queue<node> q;
void add(int u,int v,int w)
{
     k++;
     b[k].to=v;b[k].ne=head[u];b[k].w=w;head[u]=k;
}
void add2(int u,int v,int a,int b)
{
      kk++;
      s[kk].fr=u;s[kk].to=v;s[kk].a=a;s[kk].b=b;
}
inline int read()
{
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); }
    return x;
}
int cmp(const edge2 &q,const edge2 &w)
{
     return q.a<w.a;
}
void spfa()
{
     int id;
     while(!q.empty()){
         now=q.top();q.pop();
         id=now.id; 
         vis[id]=0;
         for(int i=head[id];i!=-1;i=b[i].ne)
            if(dis[b[i].to]>max(dis[id],b[i].w)){
               dis[b[i].to]=max(dis[id],b[i].w);
               if(!vis[b[i].to]){
                   vis[b[i].to]=1;
                   tmp.id=b[i].to;
                   q.push(tmp);
               }
         }
     }
}
int main()
{
    freopen("magicalforest.in","r",stdin);
    freopen("magicalforest.out","w",stdout);
    memset(head,-1,sizeof(head));
    memset(dis,0x7f,sizeof(dis));
    n=read();m=read();
    int x,y,ai,bi;
    int op;
    int ans=0x7fffffff;
    for(int i=1;i<=m;i++){
       x=read();y=read();ai=read();bi=read();
       add2(x,y,ai,bi);
    }
    sort(s+1,s+m+1,cmp);
    dis[1]=0;vis[1]=1;
    tmp.id=1; q.push(tmp);
    for(int i=1;i<=m;i++){
          op=s[i].a;
          int j=i;
          for(j=i;j<=m;j++)
          if(s[j].a==op){
               add(s[j].fr,s[j].to,s[j].b);
               add(s[j].to,s[j].fr,s[j].b);
               if(!vis[s[j].fr]){
                  vis[s[j].fr]=1;
                  tmp.id=s[j].fr;q.push(tmp);
               }
               if(!vis[s[j].to]){
                  vis[s[j].to]=1;
                  tmp.id=s[j].to;q.push(tmp);
               } 
          }
          else break;
          spfa();
          ans=min(ans,dis[n]+op);
          i=j-1;
    }
    if(ans>1000000000) printf("-1\n");
    else printf("%d",ans);
    return 0;
}