最短路:带限制的最短路,邻接表建图,dijkstra ZOJ 3946+HDU 2680 (简单点的)

来源:互联网 发布:竖笛指法软件 编辑:程序博客网 时间:2024/06/08 06:06

单源最短路,但是要求出在最短路的限制下,所需要的话费也要最少

故比平常的算法多加个优先队列,也就是优先处理那些发费小的,然后处理过就标记了就行了,下次就不会再去处理了


代码如下。也不是很懂,回头再看

#include<stdio.h>#include<queue>using namespace std;#include<string.h>long long u[200010];long long d[200010];long long w[200010];long long first[200010];long long next[200010];long long dis[200010];long long vis[200010];struct node{    long long x,d,w;    node(long long x,long long d,long long w):x(x),d(d),w(w) {};    bool operator<(const node &a)const    {        if(d==a.d)            return w>a.w;        else return d>a.d;    }};int main(){    long long test;    scanf("%lld",&test);    while(test--)    {        //memset(vis,0,sizeof(vis));        long long n,m;        scanf("%lld%lld",&n,&m);        for (long long i = 0; i <= n; i++)            dis[i] = first[i] = -1, vis[i] = 0;        long long count=0;        for(long long i=1; i<=m; i++)        {            long long x,y,a,b;            scanf("%lld%lld%lld%lld",&x,&y,&a,&b);            u[count]=y;            d[count]=a;            w[count]=b;            next[count]=first[x];            first[x]=count++;            u[count]=x;            d[count]=a;            w[count]=b;            next[count]=first[y];            first[y]=count++;        }        priority_queue<node>q;        q.push(node(0,0,0));        dis[0]=0;        long long ansd=0;        long long answ=0;        while(!q.empty())        {            node now=q.top();            q.pop();            if(vis[now.x]==1)                continue;            else vis[now.x]=1;            ansd+=now.d;            answ+=now.w;            for(long long i=first[now.x]; i!=-1; i=next[i])            {                if(dis[u[i]]==-1||dis[u[i]]>=now.d+d[i])                {                    dis[u[i]]=now.d+d[i];                    q.push(node (u[i], dis[u[i]], w[i]));                }            }        }        printf("%lld %lld\n",ansd,answ);    }}

HDU 2680

反向遍历

#include<stdio.h>#include<queue>using namespace std;#include<string.h>#define INF 0x3f3f3f3flong long u[100010];long long d[100010];long long w[100010];long long first[100010];long long nextt[100010];long long dis[100010];long long vis[100010];struct node{    long long x,d;    node(long long x,long long d):x(x),d(d) {};    bool operator<(const node &a)const    {        if(d==a.d) return x<a.x;        else return d > a.d;    }};int  main(){    //memset(vis,0,sizeof(vis));    long long n,m,s;    while(  scanf("%lld%lld%lld",&n,&m,&s)!=EOF)    {        for (long long i = 0; i <= n; i++)            dis[i] =INF,first[i] = -1, vis[i] = 0;        long long count=0;        for(long long i=1; i<=m; i++)        {            long long x,y,a,b;            scanf("%lld%lld%lld",&x,&y,&a);            u[count]=x;            d[count]=a;            nextt[count]=first[y];            first[y]=count++;        }        priority_queue<node>q;        dis[s]=0;        q.push(node(s,dis[s]));        while(!q.empty())        {            node now=q.top();            q.pop();            for(long long i=first[now.x]; i!=-1; i=nextt[i])            {                if(dis[u[i]]>now.d+d[i])                {                    dis[u[i]]=now.d+d[i];                    q.push(node (u[i], dis[u[i]]));                }            }        }//        for(long long i=1; i<=n; i++)//            printf("%d\n",dis[i]);        long long t;        long long minn=INF;        scanf("%lld",&t);        while(t--)        {            long long kk;            scanf("%lld",&kk);            minn=min(minn,dis[kk]);        }        if(minn==INF)            printf("-1\n");        else printf("%lld\n",minn);    }}


0 0
原创粉丝点击