标签:bfs printf out for cos queue include string char
好吧,这就是传说中的双关键值最短路。
说起建图来,也挺好想的嘛,反正公交车线路,爱从哪站上车,哪站下车,随你。
于是就线路上的点,两两连边。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();} return num*t; } const int N=1010,inf=1e9; const long long INF=1e16; int s,t,n,a[110],g[N][N]; long long d1[N],cost[N][N]; int d2[N],lon[N][N]; void bfs(){ for(int i=1;i<=1010;i++) d1[i]=INF,d2[i]=inf; queue<int> q; q.push(s);d1[s]=d2[s]=0; while(!q.empty()){ int x=q.front();q.pop(); for(int i=1;i<=1000;i++){ if(!g[x][i])continue; int y=i,c=cost[x][y],l=lon[x][y]; if(d1[x]+c<d1[y]){ d1[y]=d1[x]+c; d2[y]=d2[x]+l; q.push(y); } if(d1[x]+c==d1[y]&&d2[x]+l<d2[y]) d2[y]=d2[x]+l; } } if(d1[t]==INF)puts("-1 -1"); else printf("%lld %d",d1[t],d2[t]); } int main() { s=read();t=read();n=read(); for(int i=1;i<=1000;i++) for(int j=1;j<=1000;j++) cost[i][j]=INF,lon[i][j]=inf; for(int i=1;i<=n;i++){ long long m;scanf("%lld",&m); int len=read(); for(int j=1;j<=len;j++)a[j]=read(); for(int j=1;j<len;j++) for(int k=j+1;k<=len;k++){ if(a[j]==a[k])continue; g[a[j]][a[k]]=1; if(cost[a[j]][a[k]]>m){ cost[a[j]][a[k]]=m; lon[a[j]][a[k]]=k-j; } if(cost[a[j]][a[k]]==m&&lon[a[j]][a[k]]>k-j) lon[a[j]][a[k]]=k-j; } } bfs(); return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
标签:bfs printf out for cos queue include string char
原文地址:http://www.cnblogs.com/Yzyet/p/7473138.html