hdu 4725 (spfa(deque)+建图(建图很难)) 求最短路

来源:互联网 发布:咸鱼表情出处 知乎 编辑:程序博客网 时间:2024/05/21 10:14
//spfa方法+deque优化#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<set>#include<map>#include<list>#include<queue>#include<vector>#define tree int o,int l,int r#define lson o<<1,l,mid#define rson o<<1|1,mid+1,r#define lo o<<1#define ro o<<1|1#define ULL unsigned long long#define LL long long#define inf 0x7fffffff#define eps 1e-7#define N 100005*3using namespace std;typedef pair<int,int> pii;int m,n,T,t,c;vector<pii >g[N];int d[N],inq[N];void init(){    for (int i=0; i<=3*n; ++i )    {        g[i].clear();    }    memset(inq,0,sizeof(inq));    memset(d,0x7f,sizeof(d));}int main(){#ifndef ONLINE_JUDGE    freopen("ex.in","r",stdin);#endif    scanf("%d",&T);    int ncase=0;    while(T--)    {        scanf("%d%d%d",&n,&m,&c);        init();        for (int i=1; i<=n; ++i )        {            scanf("%d",&t);            if(i!=1)                g[n+i*2-1].push_back(make_pair(n+(i-1)*2,c));//层的内部            if(i!=n)                g[n+i*2-1].push_back(make_pair(n+(i+1)*2,c));            g[i].push_back(make_pair(n+t*2-1,0));//层的外部            g[n+t*2].push_back(make_pair(i,0));        }        while(m--)        {            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            g[x].push_back(make_pair(y,z));            g[y].push_back(make_pair(x,z));        }        deque<int>q;        q.push_back(1);        d[1]=0;        inq[1]=1;        while(!q.empty())        {            int u=q.front();            q.pop_front();            inq[u]=0;//            cout<<"##u="<<u<<endl;            for(int i=0; i<g[u].size(); i++)            {                int v=g[u][i].first;                int len=g[u][i].second;                if(d[v]>d[u]+len)                {                    d[v]=d[u]+len;                    if(!inq[v])                    {                        if(!q.empty())                        {                            int f=q.front();                            if(d[f]>=d[v])//优化一下,竟然过了,呵呵                                q.push_front(v);                            else                                q.push_back(v);                        }                        else                            q.push_back(v);                        inq[v]=1;                    }                }            }        }//        for (int i=1; i<=n; ++i )//            cout<<"##d[i]="<<d[i]<<endl;        printf("Case #%d: %d\n",++ncase,d[n]!=0x7f7f7f7f?d[n]:-1);    }    return 0;}

原创粉丝点击