HDU 3790 最短路径问题

来源:互联网 发布:网络赌钱游戏网站 编辑:程序博客网 时间:2024/06/03 23:45

最短路问题。

2个权值,长度和费用。

优先更新 长度与费用。

长度相等 再更新费用。


开始用SFPA 结果更新费用搞错了,就用了Dijkstra。然后AC了又回头改,SPFA也AC了。


SPFA :

#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<queue>#include<map>#include<iostream>#define INF 0xfffffffusing namespace std;int n,m;bool vis[1001];int dis[1001],cost[1001];struct lx{    int v,d,p;};vector<lx>g[1001];void SPFA(int start,int thend){    for(int i=1;i<=n;i++)    {        dis[i]=cost[i]=INF;        vis[i]=0;    }    queue<int>q;    vis[start]=1,dis[start]=0,cost[start]=0;    q.push(start);    while(!q.empty())    {        int u=q.front();q.pop();        vis[u]=0;        for(int j=0;j<g[u].size();j++)        {            int v=g[u][j].v;            int d=g[u][j].d;            int p=g[u][j].p;            if(dis[v]>dis[u]+d)            {                dis[v]=dis[u]+d;                cost[v]=cost[u]+p;                if(!vis[v])                {                    vis[v]=1;                    q.push(v);                }            }            else if(dis[v]==dis[u]+d)            {                if(cost[v]>cost[u]+p)                    cost[v]=cost[u]+p;            }        }    }    printf("%d %d\n",dis[thend],cost[thend]);}int main(){    while(scanf("%d%d",&n,&m),n&&m)    {        for(int i=1;i<=n;i++)        g[i].clear();        while(m--)        {            int u,v,d,p;            scanf("%d%d%d%d",&u,&v,&d,&p);            lx now;            now.d=d,now.p=p;            now.v=v,g[u].push_back(now);            now.v=u,g[v].push_back(now);        }        int start,thend;        scanf("%d%d",&start,&thend);        SPFA(start,thend);    }}



Dijkstra 


#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<queue>#include<map>#include<iostream>#define INF 0xfffffffusing namespace std;int n,m;struct lx{    int v,d,p;};vector<lx>g[1001];void Dijkstra(int start,int thend){    int dis[1001],cost[1001];    bool vis[1001];    for(int i=1;i<=n;i++)        dis[i]=cost[i]=INF,vis[i]=0;    dis[start]=0;    cost[start]=0;    for(int i=1;i<=n;i++)    {        int mi=INF,u=start;        for(int j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]<mi)                mi=dis[j],u=j;        }        vis[u]=1;        for(int j=0;j<g[u].size();j++)        {            int v=g[u][j].v;            int d=g[u][j].d;            int p=g[u][j].p;            if(!vis[v])            {                if(dis[u]+d<dis[v])                {                    dis[v]=dis[u]+d;cost[v]=cost[u]+p;                }                else if(dis[u]+d==dis[v])                {                    if(cost[v]>cost[u]+p)                    cost[v]=cost[u]+p;                }            }        }    }    printf("%d %d\n",dis[thend],cost[thend]);}int main(){    while(scanf("%d%d",&n,&m),n||m)    {        for(int i=1; i<=n; i++)            g[i].clear();        while(m--)        {            int u,v,d,p;            scanf("%d%d%d%d",&u,&v,&d,&p);            lx now;            now.d=d,now.p=p;            now.v=u,g[v].push_back(now);            now.v=v,g[u].push_back(now);        }        int start,thend;        scanf("%d%d",&start,&thend);        Dijkstra(start,thend);    }}




0 0
原创粉丝点击