【20160904】NOIP模拟赛T4

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;
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、下4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、下4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值