T4
每行给出1条公交线路(不能在一辆车上折返)共m行,求出从1到n需要的最少换乘次数。
1
题解
对于每一条线路,我们对除了这个点以外此线路上所有的点加一条权值为1的边。然后dijkstra 复杂度O(m*n^2+n^2)
关键在于读入 ,because你事先不知道每一条线路有多少个站点。
UPD1:
换乘次数是坐车次数-1
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#define inf 0x1f1f1f1f
using namespace std;
int n,m,mp[505][505],a[505];
void read(){
memset(a,0,sizeof(a));
char c=getchar();
int p=1;
a[p]=c-'0';
while(1){
c=getchar();
if(c>='0'&&c<='9')
a[p]=a[p]*10+c-'0';
else if(c==' '){
p++;
continue;
}
else if(c=='\n'||c==EOF){
break;
}
}
for(int i=1;i<=p;i++){
if(a[i]>=1&&a[i]<=n){
for(int j=i+1;j<=p;j++){
if(a[j]>=1&&a[j]<=n)
mp[a[i]][a[j]]=1;
}
}
//printf("%d ",a[i]);
}
}
int dijkstra(){
int vis[505];
int dis[505];
memset(vis,0,sizeof(vis));
memset(dis,0x1f,sizeof(dis));
vis[1]=1;
dis[1]=0;
for(int i=1;i<=n;i++){
if(mp[1][i]==1)dis[i]=1;
}
int p;
for(int i=1;i<=n;i++){
int md=inf;p=0;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<=md){
md=dis[j];
p=j;
}
}
if(p==0||p==n)break;
vis[p]=true;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[p]+mp[p][j]<=dis[j]){
dis[j]=dis[p]+mp[p][j];
}
}
}
return dis[n];
}
int main(){
freopen("roud.in","r",stdin);
freopen("roud.out","w",stdout);
scanf("%d",&m);
scanf("%d",&n);
getchar();
memset(mp,0x1f,sizeof(mp));
for(int i=1;i<=n;i++){
mp[i][i]=0;
}
for(int i=1;i<=m;i++){
read();
}
int ans=dijkstra();
if(ans>=1e5){
printf("No Roud!");
return 0;
}
printf("%d",ans-1);
return 0;
}