您的位置:首页 > 其它

[JLOI2011]飞行路线 分层图最短路

2014-03-05 21:10 197 查看
  裸的分层图最短路,SPFA+SLF解决  bitset数组下标开反 RE了半天。。。。

  

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <deque>
#include <utility>
#include <bitset>
#define MAXN 210000
#define FR first
#define SC second
#define MP make_pair
#define INF 100000000
using namespace std;
bitset<11> vis[MAXN];
typedef pair<int,int > PII;
deque<PII> q;
int dis[MAXN][11];
int n,m,s,t,lim,cnt;
struct node
{
int p,next,w;
}edge[MAXN];
int head[MAXN];
void insert(int a,int b,int c)
{
edge[++cnt].p=b;
edge[cnt].next=head[a];
edge[cnt].w=c;
head[a]=cnt;
}
void SPFA()
{
for (int i=1;i<=n;++i) for (int j=0;j<=lim;++j) dis[i][j]=INF;
dis[s][0]=0;
for (int i=1;i<=n;++i) vis[i].reset();
vis[s][0]=true;
q.push_back(MP(s,0));
while (!q.empty())
{
int u=q.front().FR,time=q.front().SC;
q.pop_front();
vis[u][time]=false;
for (int k=head[u];k;k=edge[k].next)
{
int v=edge[k].p;
for (int op=0;op<=1;++op)
{
if (op+time>lim) break;
int tmp;
if (op) tmp=0; else tmp=edge[k].w;
if (tmp+dis[u][time]<dis[v][time+op])
{
dis[v][time+op]=tmp+dis[u][time];
if (!vis[v][time+op])
{
vis[v][time+op]=true;
if (q.empty()||dis[v][time+op]<dis[q.front().FR][q.front().SC]) q.push_front(MP(v,time+op));
else
q.push_back(MP(v,time+op));
}
}
}
}
}
}
int main()
{
cin>>n>>m>>lim>>s>>t;
s++,t++;
int x,y,z;
for (int i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
++x,++y;
insert(x,y,z);
insert(y,x,z);
}
SPFA();
int ans=INF;
for (int i=0;i<=lim;++i) ans=min(ans,dis[t][i]);
cout<<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路