HDU 3790 -最短路径问题
2014-07-28 18:54
417 查看
题目链接:最短路径问题
两个权值的最短路问题
SFPA +前向星 水过250ms
两个权值的最短路问题
SFPA +前向星 水过250ms
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> const int INF = 1e7; using namespace std; int n,m,t; int ma[1001][1001],dis[1001],cost[1001]; bool vis[1001]; struct node{ int u,v,w, ww; int next; }edge[100001]; int head[100001]; void init() { memset(head,0,sizeof(head)); for(int i = 1;i<=n;i++) { dis[i] = INF; cost[i] = INF; vis[i] = 0; } t = 1; } int s,e; void add(int a,int b,int c,int d) { edge[t].v = b; edge[t].w = c; edge[t].ww = d; edge[t].next = head[a]; head[a] = t++; } void SPFA() { queue<int>q; q.push(s); vis[s] = true; dis[s] = 0; cost[s] = 0; // int sum = 0; while(!q.empty()) { int p = q.front(); // printf("%d",p); q.pop(); vis[p] = 0; if(head[p]) { for(int pp = head[p];pp!=0;pp = edge[pp].next) { // printf("->%d\n",edge[pp].v); if(dis[p] + edge[pp].w < dis[edge[pp].v]) { dis[edge[pp].v] = dis[p] + edge[pp].w ; cost[edge[pp].v] = cost[p] + edge[pp].ww; // sum += edge[pp].ww; if(!vis[edge[pp].v]) { q.push(edge[pp].v); vis[edge[pp].v] = true; } } else if(dis[p] + edge[pp].w == dis[edge[pp].v]) { if(cost[edge[pp].v] > cost[p] + edge[pp].ww) { cost[edge[pp].v] = cost[p] + edge[pp].ww; } } } } } printf("%d %d\n",dis[e],cost[e]); } int main() { int a,b,c,d; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0 && m==0) break ; init(); for(int i = 0;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,&e); SPFA(); } return 0; }
相关文章推荐
- hdu 3790 最短路径问题 【双权值最短路(相同最小距离,求最小花费)】
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- HDU 3790 最短路径问题 Dijkstra
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题(dijkstra加强版)
- hdu 3790 最短路径问题
- HDU 3790 最短路径问题 双向限制最短路
- HDU 3790 最短路径问题(经典呀)
- 最短路径问题 hdu 3790
- hdu 3790 最短路径问题 (dijkstra算法+memset()用法)
- Hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- HDU-3790-最短路径问题
- HDU 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题
- hdu 3790 最短路径问题