#216. 最小花费最短路

好像不早了啊这个时间。。。唉反正没事干,还要跟人聊天,正好还欠那么多,能写一些就写一些吧嘤嘤嘤

究极题面魔法术lalala(傻子博主)

这题呢,基本上就是一个裸的最短路,虽然老师让我们用dijkstra去做,但是。。好像spfa等也可以过,当然这里还是用老师要用的方法比较好

 1 #include<set>
 2 #include<map>
 3 #include<list>
 4 #include<queue>
 5 #include<stack>
 6 #include<string>
 7 #include<cmath>
 8 #include<ctime>
 9 #include<vector>
10 #include<bitset>
11 #include<memory>
12 #include<utility>
13 #include<cstdio>
14 #include<sstream>
15 #include<iostream>
16 #include<cstdlib>
17 #include<cstring>
18 #include<algorithm>
19 using namespace std;
20 
21 int n,m,s,t,tot;
22 int next[1000005],head[1000005],to[1000005],cost[1000005],value[1000005],dis[1000005],ans_c[1000005];
23 struct node{
24     int id,d,v;
25 }a[1000005];
26 bool operator > (const node a,const node b){//重构
27     return a.d>b.d;
28 }
29 priority_queue <node,vector<node>,greater<node> > Q;//小根堆进行堆优化
30 
31 void add(int u,int v,int w,int p){//链式前向星
32     next[++tot]=head[u];
33     head[u]=tot;
34     to[tot]=v;
35     cost[tot]=w;
36     value[tot]=p;
37     return;
38 }
39 void dijkstra(){//最短路
40     memset(dis,0x3f,sizeof(dis));
41     memset(ans_c,0x3f,sizeof(ans_c));
42     dis[s]=0;
43     ans_c[s]=0;
44     Q.push((node){s,0,0});
45     while(!Q.empty()){
46         node x=Q.top(); 
47         Q.pop();
48         for(int i=head[x.id];i;i=next[i])
49             if(x.d+cost[i]<dis[to[i]]||(x.d+cost[i]==dis[to[i]]&&ans_c[to[i]]>x.v+value[i])){//意为若该路径小于记录下来的路径或是等于但费用较小
50                 dis[to[i]]=x.d+cost[i];
51                 ans_c[to[i]]=x.v+value[i];
52                 Q.push((node){to[i],dis[to[i]],ans_c[to[i]]});
53             }
54     }
55     return;
56 }
57 int main(){
58     while(1){
59         scanf("%d%d",&n,&m);
60         if(n==0&&m==0){//结束条件
61             break;
62         }
63         memset(head,0,sizeof(head));
64         while(!Q.empty()){Q.pop();}
65         for(int i=1;i<=m;i++){
66             int u,v,w,c;
67             scanf("%d%d%d%d",&u,&v,&w,&c);
68             add(u,v,w,c);//因为无向图,故双向路径
69             add(v,u,w,c);
70         }
71         scanf("%d%d",&s,&t);
72         memset(dis,0,sizeof(dis));
73         memset(ans_c,0,sizeof(ans_c));
74         dijkstra();
75         printf("%d %d\n",dis[t],ans_c[t]);
76     }
77     return 0;
78 }

这题在机房敲了好长时间地说。。完全和AC代码没有区别。。回家重打了一遍,然后就过了???莫名。。

猜你喜欢

转载自www.cnblogs.com/hahaha2124652975/p/11124122.html