AC代码:
#include<iostream> #include<string.h> #include<algorithm> #include<limits.h> #define M 99999999 #define N 1005 #define FOR(i,s,t) for(int i=(s);i<=t;++i) using namespace std; int dist[N]; int pas[N]; int map[N][N]; int pay[N][N]; bool visit[N]; int n,m,p,q; void Dijstra() { int now=p; dist[now]=0; pas[now]=0; visit[now]=false; FOR(i,1,n) { FOR(j,1,n) if(visit[j]) { if(dist[j]>dist[now]+map[now][j]) {dist[j]=dist[now]+map[now][j]; pas[j]=pas[now]+pay[now][j]; } else if(dist[j]==dist[now]+map[now][j]&&pas[j]>pas[now]+pay[now][j]) pas[j]=pas[now]+pay[now][j]; } int minx=M; FOR(j,1,n) if(visit[j]&&dist[j]<minx) minx=dist[now=j]; visit[now]=false; } cout<<dist[q]<<" "<<pas[q]<<endl; } int main() { while(cin>>n>>m&&n&&m) { FOR(i,1,n) FOR(j,1,n) { dist[i]=M; map[i][j]=M; visit[i]=true; pas[i]=M; pay[i][j]=M; } FOR(i,1,m) { int a,b,c,d; cin>>a>>b>>c>>d; if(map[a][b]>c) {map[a][b]=map[b][a]=c; pay[a][b]=pay[b][a]=d; } } cin>>p>>q; Dijstra(); } return 0; }
spfa+优先队列优化:
#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> #include<queue> #define CLR(arr,val) memset(arr,val,sizeof(arr)) #define N 200005 #define M 1005 #define MAX 999999999 using namespace std; typedef struct node { int num; int len; int cost; int Next; friend bool operator<(node a,node b) {return a.len>b.len;} }Node; Node s[N]; int n,m,dis[M],pay[M],head[M],res; bool vis[M]; void init() { res=0; CLR(head,-1); for(int i=1;i<=n;++i) pay[i]=MAX,dis[i]=MAX; CLR(vis,false); } void add(int a,int b,int c,int d) { s[res].num=b; s[res].len=c; s[res].cost=d; s[res].Next=head[a]; head[a]=res++; } void SPFA(int sta) { priority_queue<int>Q; Q.push(sta); vis[sta]=true; pay[sta]=0; dis[sta]=0; while(!Q.empty()) { int v=Q.top(); Q.pop(); vis[v]=false; for(int i=head[v];i!=-1;i=s[i].Next) { int len=s[i].len; int cost=s[i].cost; int u=s[i].num; if(dis[u]>dis[v]+len) { dis[u]=dis[v]+len; pay[u]=pay[v]+cost; if(!vis[u]) { Q.push(u); vis[u]=true; } } else if(dis[u]==dis[v]+len&&pay[u]>pay[v]+cost) { pay[u]=pay[v]+cost; if(!vis[u]) { Q.push(u); vis[u]=true; } } } } } int main() { while(~scanf("%d%d",&n,&m)) { init(); if(!n&&!m) break; for(int i=0;i!=m;++i) { int a,b,c,e; scanf("%d%d%d%d",&a,&b,&c,&e); add(a,b,c,e); add(b,a,c,e); } int sta,end; scanf("%d%d",&sta,&end); SPFA(sta); printf("%d %d\n",dis[end],pay[end]); }return 0; }
dijstra+优先队列优化:
#include<iostream> #include<string.h> #include<cstdio> #include<string> #include<limits.h> #include<queue> #define N 200005 #define M 999999999 using namespace std; typedef struct node { int num; int len; int Next; int cost; }Node; int res,head[1005],dis[1005],n,pay[1005]; Node s[N]; typedef pair<int,int> pii; void init() { memset(head,-1,sizeof(head)); res=0; } void add(int a,int b,int c,int d) { s[res].num=b; s[res].len=c; s[res].cost=d; s[res].Next=head[a]; head[a]=res++; } void dijstra(int sta) { bool vis[1005]; for(int i=1;i<=n;++i) dis[i]=(i==sta)?0:M,pay[i]=(i==sta)?0:M,vis[i]=false; priority_queue<pii,vector<pii>,greater<pii> >Q; Q.push(make_pair(dis[sta],sta)); while(!Q.empty()) { pii u=Q.top(); Q.pop(); int x=u.second; if(vis[x]) continue; vis[x]=true; for(int i=head[x];i!=-1;i=s[i].Next) if(dis[s[i].num]>dis[x]+s[i].len) { dis[s[i].num]=dis[x]+s[i].len; pay[s[i].num]=pay[x]+s[i].cost; Q.push(make_pair(dis[s[i].num],s[i].num)); } else if(dis[s[i].num]==dis[x]+s[i].len) { if(pay[s[i].num]>pay[x]+s[i].cost) { pay[s[i].num]=pay[x]+s[i].cost; Q.push(make_pair(dis[s[i].num],s[i].num)); } } } } int main() { int m; while(~scanf("%d%d",&n,&m)) { init(); if(!n&&!m) break; for(int i=0;i!=m;++i) { int a,b,c,e; scanf("%d%d%d%d",&a,&b,&c,&e); add(a,b,c,e); add(b,a,c,e); } int sta,end; scanf("%d%d",&sta,&end); dijstra(sta); printf("%d %d\n",dis[end],pay[end]); }return 0; }
spfa+优先队列优化的:125ms
dijs+优先队列优化的:109ms