HDU 3790 最短路径问题(SPFA || Dijkstra )

时间:2022-02-14 09:41:33

题目链接

题意 : 中文题不详述。

思路 :无论是SPFA还是Dijkstra都在更新最短路的那个地方直接将花费更新了就行,还有别忘了判重边,话说因为忘了判重边WA了一次。

HDU 3790 最短路径问题(SPFA || Dijkstra )HDU 3790 最短路径问题(SPFA || Dijkstra )
 1 //3790
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 const int INF = 1 << 28 ;
 8 
 9 using namespace std;
10 
11 int n, m,s,t;
12 int cost[1100][1100] ,mapp[1100][1010];
13 int dist[1100],cost1[1100] ;
14 int vis[1100] ;
15 
16 void spfa(int src)
17 {
18     queue<int> Q ;
19     memset(vis,0,sizeof(vis)) ;
20     for(int i = 1 ; i <= n ; i++)
21     {
22         dist[i] = INF ;
23         cost1[i] = INF ;
24     }
25     dist[src] = 0 ;
26     vis[src] = 1 ;
27     cost1[src] = 0;
28     Q.push(src) ;
29     while(!Q.empty())
30     {
31         int u = Q.front() ;
32         Q.pop() ;
33         vis[u] = 0;
34         for(int i = 1 ; i <= n ; i++)
35         {
36 
37             if(dist[i] > dist[u] + mapp[u][i])
38             {
39                 dist[i] = dist[u] + mapp[u][i] ;
40                 cost1[i] = cost1[u] + cost[u][i] ;
41                 if(!vis[i])
42                 {
43                     vis[i] = 1 ;
44                     Q.push(i) ;
45                 }
46             }
47             else if(dist[i] == dist[u]+mapp[u][i])
48             {
49                 if(cost1[i] > cost1[u] + cost[u][i])
50                 {
51                     cost1[i]=cost1[u] + cost[u][i];
52                     if(!vis[i])
53                     {
54                         vis[i] = 1 ;
55                         Q.push(i) ;
56                     }
57                 }
58 
59             }
60         }
61     }
62 }
63 void Init()
64 {
65     for(int i = 1 ; i <= n ; i++)
66         for(int j = 1 ; j <= n ; j++)
67         {
68             if(i == j) mapp[i][j] = cost[i][j] = 0 ;
69             else mapp[i][j] = cost[i][j] = INF ;
70         }
71 }
72 int main()
73 {
74     //
75     while(cin >> n >> m)
76     {
77         if(n == 0 && m == 0) break ;
78         int a, b , d , p ;
79         Init() ;
80         for(int i = 0 ; i < m ; i++)
81         {
82             cin >> a >> b >> d >> p ;
83             if(mapp[a][b] > d)
84             {
85                 mapp[a][b] = mapp[b][a] = d ;
86                 cost[a][b] = cost[b][a] = p ;
87             }
88             else if(mapp[a][b] == d&&cost[a][b] > p)
89                 cost[a][b] = cost[b][a] = p ;
90         }
91         cin >> s >> t ;
92         spfa(s) ;
93         printf("%d %d\n",dist[t],cost1[t]) ;
94     }
95     return 0;
96 }
View Code

会神的Dijkstra

HDU 3790 最短路径问题(SPFA || Dijkstra )HDU 3790 最短路径问题(SPFA || Dijkstra )
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 1001
 5 using namespace std;
 6 const int inf=1<<28;
 7 
 8 int g[maxn][maxn];
 9 int cost[maxn][maxn];
10 int n,m,a,b,d,p,s,e;
11 bool vis[maxn];
12 int dis[maxn],c[maxn];
13 
14 void inti()
15 {
16     for(int i=1; i<=n; i++)
17     {
18         for(int j=1; j<=n; j++)
19         {
20             if(i==j)
21             {
22                 g[i][j]=0;
23                 cost[i][j]=0;
24             }
25             else
26             {
27                 g[i][j]=inf;
28                 cost[i][j]=inf;
29             }
30         }
31     }
32 }
33 
34 void dijkstra(int str)
35 {
36     memset(vis,false,sizeof(vis));
37     for(int i=1; i<=n; i++)
38     {
39         dis[i]=g[str][i];
40         c[i]=cost[str][i];
41     }
42     dis[str]=0;
43     c[str]=0; vis[str]=true;
44     for(int i=1; i<n; i++)
45     {
46         int m=inf,x;
47         for(int y=1; y<=n; y++)  if(!vis[y]&&dis[y]<m) m=dis[x=y];
48         vis[x]=true;
49         for(int y=1; y<=n; y++)
50         {
51             if(!vis[y]&&g[x][y]!=inf)
52             {
53                 if(dis[y]>dis[x]+g[x][y])
54                 {
55                     dis[y]=dis[x]+g[x][y];
56                     c[y]=c[x]+cost[x][y];
57                 }
58                 else if(dis[y]==dis[x]+g[x][y])
59                 {
60                     if(c[y]>c[x]+cost[x][y])
61                         c[y]=c[x]+cost[x][y];
62                 }
63             }
64         }
65     }
66 }
67 int main()
68 {
69     while(scanf("%d%d",&n,&m)!=EOF)
70     {
71         if(n==0&&m==0) break;
72         inti();
73         for(int i=0; i<m; i++)
74         {
75             scanf("%d%d%d%d",&a,&b,&d,&p);
76             if(d<g[a][b])
77             {
78                 g[a][b]=g[b][a]=d;
79                 cost[a][b]=cost[b][a]=p;
80             }
81 
82         }
83         scanf("%d%d",&s,&e);
84         dijkstra(s);
85         printf("%d %d\n",dis[e],c[e]);
86     }
87     return 0;
88 }
View Code