求最短路的同事求最小花费
板子题 练习下堆优化的dijstr
dij+邻接表
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
struct Edge{
int v;
int w;
int t;
int next;
};
Edge e[maxn];
struct qnode{
int u;
int w;
int t;
qnode(int u=0,int w=0,int t=0):u(u),w(w),t(t){}
bool operator < (const qnode& a) const{
if(w==a.w) return t>a.t;
else return w>a.w;
}
};
int dis[maxn];
int vis[maxn];
int tis[maxn];
int head[maxn];
int n,m;
int size;
void adde(int u,int v,int w,int t){
e[size].v=v;
e[size].w=w;
e[size].t=t;
e[size].next=head[u];
head[u]=size;
size++;
}
void dij(int s){
priority_queue<qnode> q;
dis[s]=0;
tis[s]=0;
q.push(qnode(s,0,0));
while(!q.empty()){
qnode tt=q.top();
q.pop();
int u=tt.u;
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
int w=e[i].w;
int t=e[i].t;
if(!vis[v]){
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
tis[v]=tis[u]+t;
q.push(qnode(v,dis[v],tis[v]));
}
else if(dis[v]==dis[u]+w &&tis[v]>tis[u]+t){
tis[v]=tis[u]+t;
q.push(qnode(v,dis[v],tis[v]));
}
// q.push(qnode(v,dis[v],tis[v])); 放这里是错的
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m)){
if(n==m&&n==0) break;
size=1;
for(int i=1;i<=n;i++){
tis[i]=inf;
dis[i]=inf;
head[i]=-1;
vis[i]=0;
}
while(m--){
int x,y,z,c;
scanf("%d%d%d%d",&x,&y,&z,&c);
adde(x,y,z,c);
adde(y,x,z,c);
}
int x,y;
scanf("%d%d",&x,&y);
dij(x);
printf("%d %d\n",dis[y],tis[y]);
}
return 0;
}
dij+vector 比上面慢30ms
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=10000;
struct edge{
int v;
int w;
int t;
edge(int v=0,int w=0,int t=0):v(v),w(w),t(t){}
};
vector<edge> e[maxn];
struct qnode{
int u;
int w;
int t;
qnode(int u=0,int w=0,int t=0):u(u),w(w),t(t){}
bool operator < (const qnode& a) const{
if(w==a.w ) return t>a.t;
else return w>a.w;
}
};
int dis[maxn];
int tis[maxn];
int n,m;
void dij(int s){
priority_queue<qnode> q;
for(int i=1;i<=n;i++){
dis[i]=inf;
tis[i]=inf;
}
dis[s]=0;
tis[s]=0;
q.push(qnode(s,0,0));
qnode tmp;
while(!q.empty()){
tmp=q.top();
int u=tmp.u;
q.pop();
int size=e[u].size();
for(int i=0;i<size;i++){
int v=e[u][i].v;
int w=e[u][i].w;
int t=e[u][i].t;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
tis[v]=tis[u]+t;
q.push(qnode(v,dis[v],tis[v]));
}
else if(dis[v]==dis[u]+w&&tis[v]>tis[u]+t){
tis[v]=tis[u]+t;
q.push(qnode(v,dis[v],tis[v]));
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m)){
if(n==0&&n==m) break;
for(int i=0;i<=n;i++){//必须 加 !!!
e[i].clear();
}
while(m--){
int x,y,z,c;
scanf("%d%d%d%d",&x,&y,&z,&c);
e[x].push_back(edge(y,z,c));
e[y].push_back(edge(x,z,c));
}
int x,y;
scanf("%d%d",&x,&y);
dij(x);
printf("%d %d\n",dis[y],tis[y]);
}
}