hdu 3790 最短路径问题

来源:互联网 发布:350淘宝装修平台手机版 编辑:程序博客网 时间:2024/05/12 02:19

很明显的单源点最短路问题。这个题目我的做法是直接套用spfa算法,这个算法比较好,并且能处理边的权值是负数的情况。这个题目赶脚有点像结构体排序,如果这个距离小于当前距离修改一下,如果相等则判断花费的大小关系即可。这种题目其实就是模板题。

#include<iostream>#include<stdio.h>#include<queue>#include<cstring>using namespace std;struct node{int start;int end;int money;int len;int next;};node edge[100005];int list[1005];int dist[1005];bool vis[1005];int fee[1005];int tot,n,m,s,t;void add(int a,int b,int c,int d){tot=tot+1;edge[tot].start=a;edge[tot].end=b;edge[tot].len=c;edge[tot].money=d;edge[tot].next=list[a];list[a]=tot;}void spfa(){queue<int> q;int i,l,now,j,b;memset(vis,false,sizeof(vis));memset(dist,-1,sizeof(dist));memset(fee,0,sizeof(fee));vis[s]=true;dist[s]=0;q.push(s);while(!q.empty()){now=q.front();q.pop();vis[now]=false;for(i=list[now];i!=-1;i=edge[i].next){b=edge[i].end;if(dist[b]==-1||dist[b]>dist[now]+edge[i].len){dist[b]=dist[now]+edge[i].len;fee[b]=fee[now]+edge[i].money;if(!vis[b]){vis[b]=true;q.push(b);}}else if(dist[b]==dist[now]+edge[i].len&&fee[b]>fee[now]+edge[i].money){fee[b]=fee[now]+edge[i].money;if(!vis[b]){vis[b]=true;q.push(b);}}}}}int main(){int i,a,b,c,d;while(cin>>n>>m){if(n==0&&m==0)break;tot=0;memset(list,-1,sizeof(list));for(i=1;i<=m;i++){scanf("%d%d%d%d",&a,&b,&c,&d);add(a,b,c,d);add(b,a,c,d);}scanf("%d%d",&s,&t);spfa();cout<<dist[t]<<" "<<fee[t]<<endl;}return 0;}


 

原创粉丝点击