好像不早了啊这个时间。。。唉反正没事干,还要跟人聊天,正好还欠那么多,能写一些就写一些吧嘤嘤嘤
究极题面魔法术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 ",dis[t],ans_c[t]); 76 } 77 return 0; 78 }
这题在机房敲了好长时间地说。。完全和AC代码没有区别。。回家重打了一遍,然后就过了???莫名。。