• UESTC 835


    SPFA sll优化

    个人感觉这个题的建图有问题 

    我建对了他说我错 还可能超时

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<string>
    #include<vector>
    #include<queue>
    #include<iostream>
    #include<deque>
    using namespace std;
    
    #define inf 1000000000
    #define MAXN  4000050
    int cnt;
    struct node
    {
        int to,w,next;
    }edge[MAXN];
    int head[200010];
    
    void add(int u,int v,int w)
    {
        edge[cnt].to=v;
        edge[cnt].w=w;
        edge[cnt].next=head[u];
        head[u]=cnt++;
    }
    deque<int>q1;
    bool vis[200010];
    int dis[200010];
    void spfa(int fr,int to,int n)
    {
        memset(vis,0,sizeof(vis));
        vis[1]=1;
        q1.push_back(1);
        for(int i=0;i<=to;i++)
            dis[i]=inf;
        dis[1]=0;
    
        while(!q1.empty())
        {
            int now=q1.front();
            q1.pop_front();
            vis[now]=0;
            for(int i=head[now];i!=-1;i=edge[i].next)
            {
                int v=edge[i].to;
                if(dis[v]>dis[now]+edge[i].w)
                {
                    dis[v]=dis[now]+edge[i].w;
                   // printf("%d %d
    ",v,dis[v]);
                    if(vis[v]==0)
                    {
                        vis[v]=1;
                        if(!q1.empty()&&dis[v]<dis[q1.front()])
                            q1.push_front(v);
                        else
                            q1.push_back(v);
                    }
                }
            }
        }
        if(dis[n]==inf)
            printf("-1
    ");
        else
            printf("%d
    ",dis[n]);
    }
    int en[100010];
    
    int main()
    {
        int t ,ca;
        scanf("%d",&t);
        ca=1;
        while(t--)
        {
            int n,m,c;
            scanf("%d%d%d",&n,&m,&c);
            cnt=0;
    
            memset(head,-1,sizeof(head));
            memset(vis,0,sizeof(vis));
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&en[i]);
                vis[en[i]]=1;
    //            add(i,en[i]+n,0);
     //           add(en[i]+n,i,0);
            }
    
            for(int i=1;i<n;i++)
            {
                if(vis[i]&&vis[i+1])
                {
                    add(n+i,n+i+1,c);
                    add(n+i+1,n+i,c);
                }
            }
            for(int i=1;i<=n;i++)
            {
                add(n+en[i],i,0);
                if(en[i]>1)
                    add(i,n+en[i]-1,c);
                if(en[i]<n)
                    add(i,n+en[i]+1,c);
            }
    
            for(int i=1;i<=m;i++)
            {
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                add(u,v,w);
                add(v,u,w);
            }
            printf("Case #%d: ",ca++);
            spfa(1,2*n,n);
    
        }
        return 0;
    }
  • 相关阅读:
    java虚拟机之垃圾回收机制
    java虚拟机之JVM体系结构
    java虚拟机之JVM生命周期
    删除链表中重复的结点
    (二十一)java多线程之Executors
    (十八)java多线程之Callable Future
    (十六)java多线程之优先队列PriorityBlockingQueue
    (十九)java多线程之ForkJoinPool
    (二十)java多线程之ScheduledThreadPoolExecutor
    (六)java多线程之ReadWriteLock
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6445626.html
Copyright © 2020-2023  润新知