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

来源:互联网 发布:软件系统设计模板 编辑:程序博客网 时间:2024/05/01 00:02

  裸的分层图最短路,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 100000000using 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;}

0 0
原创粉丝点击