hdu3790 最短路径问题

来源:互联网 发布:深圳市灵沃软件 编辑:程序博客网 时间:2024/06/08 09:19

题目;http://acm.hdu.edu.cn/showproblem.php?pid=3790

题意:中文题~

想法:最短路径,两种做法,Dijkstra   和 spfa。Dijkstra搜索每一个点,然后标记vis[]为true。我用spfa试着写了写,spfa主要是把没有在队列中的节点放入队列中,一开始dis[]数组初始化为最大,否则会WA掉。。


代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int INF=0x3f3f3f3f;queue <int> s;bool vis[1010];int link[1010][1010],dis[1010],cost[1010][1010],price[1010];int st,ed;int n,m;void spfa(){    for(int i=1;i<=n;i++)        dis[i]=INF;    dis[st]=0,price[st]=0;    memset(vis,false,sizeof(vis));    vis[st]=true;    s.push(st);    while(!s.empty()){        int x=s.front();        s.pop();        vis[x]=false;        for(int j=1;j<=n;j++){            if( dis[j]>dis[x]+link[x][j]||               (dis[j]==dis[x]+link[x][j]&&price[j]>price[x]+cost[x][j])   ){                    dis[j]=dis[x]+link[x][j];                    price[j]=price[x]+cost[x][j];                    if(!vis[j]){                        vis[j]=true;                        s.push(j);                    }            }        }    }    cout<<dis[ed]<<" "<<price[ed]<<endl;}int main(){    while(~scanf("%d%d",&n,&m)&&n&&m){        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                link[i][j]=link[j][i]=INF;                cost[i][j]=cost[j][i]=INF;            }        }        for(int i=0;i<m;i++){            int a,b,d,p;            scanf("%d%d%d%d",&a,&b,&d,&p);            if(link[a][b]>d){                link[a][b]=link[b][a]=d;                cost[a][b]=cost[b][a]=p;            }            else if(link[a][b]==d&&cost[a][b]>p){                cost[a][b]=cost[b][a]=p;            }        }        cin>>st>>ed;        spfa();    }    return 0;}


0 0
原创粉丝点击