bzoj3669【NOI2014】魔法森林 SPFA
来源:互联网 发布:移动宽带网络设置 编辑:程序博客网 时间:2024/04/30 06:55
调了一整个晚上一脸懵逼,加了个并查集优化就WA了= =,然而并没能发现
题意就是两个点权的最短路,标准做法LCT维护,当然我们考虑这是随机数据,我们可以用SPFA水
枚举其中一个点权,然后做另外一个点权的最短路,同时需要用许多优化防止TLE
比如因为单调性,于是每次SPFA并不需要把dis数组清0,用优先队列来维护每一次放进去的点不然写起来全是WA之类的
/************************************************************** Problem: 3669 User: BPM136 Language: C++ Result: Accepted Time:3032 ms Memory:8680 kb****************************************************************/ #include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>#include<bitset>#include<queue>#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)#define efo(i,x) for(int i=last[x];i!=0;i=e[i].next)using namespace std;inline LL read(){ LL d=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();} return d*f;}#define N 50005#define M 100005#define inf 1000000007struct hhx{ int f,v; hhx(int a,int b):f(b),v(a){} bool operator < (const hhx& a)const {return a.f<f;}};struct edge{ int y,next,c;}e[M*2];struct bian{ int u,v,a,b;}b[M*2];int last[N],ne=0;int n,m,ma,ans=inf;int h=0,t=1;int dis[N];bitset<N>inq; bool com(bian a,bian b){ return a.a<b.a;} void add(int x,int y,int c){ e[++ne].y=y;e[ne].c=c;e[ne].next=last[x];last[x]=ne;}void add2(int x,int y,int c){ add(x,y,c);add(y,x,c);// cout<<"Bian:"<<min(x,y)<<' '<<max(x,y)<<' '<<c<<endl;} void init(){ n=read(),m=read();int mi1=1000000,miN=1000000; fo(i,1,m) { int u=read(),v=read(),va=read(),vb=read(); b[i].u=u; b[i].v=v; b[i].a=va; b[i].b=vb; if(u==1||v==1)mi1=min(mi1,va); if(u==n||v==n)miN=min(miN,va); } ma=max(mi1,miN);} priority_queue<hhx>q;void spfa(){ int i,u,v; hhx X(0,0); while(!q.empty()) { X=q.top(); q.pop(); u=X.v; inq[u]=0; efo(i,u) { v=e[i].y; if(dis[v]>max(dis[u],e[i].c)) { dis[v]=max(dis[u],e[i].c); if(!inq[v]) { inq[v]=1; q.push(hhx(v,dis[v])); } } } }} void checkdis(){ cout<<"DIS:";fo(i,1,n)cout<<dis[i]<<' ';cout<<endl;} void work(){ sort(b+1,b+m+1,com); add2(b[1].u,b[1].v,b[1].b); dis[1]=0;fo(i,2,n)dis[i]=inf; inq.reset(); fo(i,1,m) { if(b[i].a==b[i-1].a||i==1||b[i].a<ma) { add2(b[i].u,b[i].v,b[i].b); q.push(hhx(b[i].u,dis[b[i].u])),inq[b[i].u]=1; q.push(hhx(b[i].v,dis[b[i].v])),inq[b[i].v]=1; continue; } spfa(); ans=min(ans,b[i-1].a+dis[n]); add2(b[i].u,b[i].v,b[i].b); q.push(hhx(b[i].u,dis[b[i].u])),inq[b[i].u]=1; q.push(hhx(b[i].v,dis[b[i].v])),inq[b[i].v]=1; } spfa(); ans=min(ans,b[m].a+dis[n]);} int main(){ init(); work(); if(ans==inf)cout<<-1<<endl;else cout<<ans<<endl; return 0;}
0 0
- 【bzoj3669】【noi2014】【魔法森林】【spfa】
- bzoj3669【NOI2014】魔法森林 SPFA
- [BZOJ3669][Noi2014]魔法森林(动态spfa)
- BZOJ3669 [Noi2014]魔法森林
- bzoj3669: [Noi2014]魔法森林
- [BZOJ3669][Noi2014]魔法森林
- 【NOI2014】【BZOJ3669】魔法森林
- [bzoj3669][NOI2014]魔法森林
- BZOJ3669: [Noi2014]魔法森林
- bzoj3669: [Noi2014]魔法森林
- BZOJ3669: [Noi2014]魔法森林
- bzoj3669 [Noi2014]魔法森林
- 【NOI2014】bzoj3669 魔法森林
- 【bzoj3669】[Noi2014]魔法森林
- 【bzoj3669】[Noi2014]魔法森林
- 【bzoj3669】[Noi2014]魔法森林
- BZOJ3669 [Noi2014]魔法森林
- 【BZOJ3669】【NOI2014】魔法森林 (spfa动态队列加点算法)
- 泛型
- ConfigParser读取配置文件包含转义字符的处理办法
- LESS
- Java list的用法排序及遍历
- 信号和trap
- bzoj3669【NOI2014】魔法森林 SPFA
- Android-AR环境搭建
- BZOJ 4318(OSU!-立方的期望)
- iOS 面试题汇总
- Tomcat 6 绑定域名和根域名
- hdoj 1874 畅通工程续【dijkstra、floyd、spfa】
- ViewFlipper左右滑动事件
- No permission to write APN settings
- 集合