题意:求一个无向图的单源最短路,其中每个边有两个权重,第一个权重值相等时路径的大小由第二个权重决定
直接套spfa板子
#include <bits/stdc++.h> using namespace std; int v,e,s,t; const int maxv=1005; struct w { int d,p; bool operator <(const w b) const { if(d==b.d)return p<b.p; return d<b.d; } w operator +(const w b)const { w a; a.d=d+b.d; a.p=p+b.p; return a; } }; vector< pair<int,w> > ve[maxv]; w d[maxv]; int vis[maxv],fa[maxv],coun[maxv]; const int maxn=200000; void init() { memset(ve,0,sizeof(ve)); memset(vis,0,sizeof(vis)); memset(fa,0,sizeof(fa)); memset(coun,0,sizeof(coun)); for(int i=1;i<=v;i++) { d[i].d=maxn; d[i].p=maxn; fa[i]=i; } int cs,ce,cd,cp; for(int i=1;i<=e;i++) { //cin>>cs>>ce>>cd>>cp; scanf("%d%d%d%d",&cs,&ce,&cd,&cp); w ccw; ccw.d=cd; ccw.p=cp; ve[cs].push_back( make_pair(ce,ccw) ); ve[ce].push_back( make_pair(cs,ccw) ); } cin>>s>>t; d[s].d=0; d[s].p=0; coun[s]=1; } bool spfa() { queue<int> q; q.push(s); vis[s]=1;//vis[i]为正1代表他在q内 while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=0;i<ve[u].size();i++) { int cv=ve[u][i].first; w cw=ve[u][i].second; if(cw+d[u]<d[cv]) {//cout<<"!"<<u<<" "<<cv<<" "; d[cv]=cw+d[u]; fa[cv]=u; if(vis[cv]==0) { vis[cv]=1; if(coun[cv]>=v)return false; coun[cv]++; q.push(cv); } } } } return true; } int main() { while(cin>>v>>e,v!=0) { init(); if(spfa()) // if(froot(t)!=s||!spfa())cout<<"-1"<<endl;else cout<< d[t].d <<" "<< d[t].p <<endl; else cout<<"-1"<<endl; } return 0; }