zoukankan      html  css  js  c++  java
  • P5767 [NOI1997]最优乘车

    这不是暑假做的建模题吗。。。

    \(g[i][j]\)为不考虑换乘情况下\(i->j\)的最短距离(依题意显然为0)

    再跑\(dijkstra\)判断换乘情况下\(1\)号点到\(n\)号点的最短距离

    const int N=510;
    int g[N][N];
    int dist[N];
    bool vis[N];
    int sta[N];
    int n,m;
    
    void dijkstra()
    {
        for(int i=1;i<=n;i++) dist[i]=g[1][i];
    
        for(int i=0;i<n;i++)
        {
            int t=-1;
            for(int j=1;j<=n;j++)
                if(!vis[j] && (t==-1 || dist[t] > dist[j]))
                    t=j;
            vis[t]=true;
    
            for(int j=1;j<=n;j++)
                dist[j]=min(dist[j],dist[t]+g[t][j]+1);
        }
    }
    
    int main()
    {
        scanf("%d%d\n",&m,&n);
    
        memset(g,0x3f,sizeof g);
        for(int i=1;i<=n;i++) g[i][i]=0;
    
        while(m--)
        {
            string line;
            getline(cin,line);
            stringstream ss(line);
            int x,cnt=0;
            while(ss>>x) sta[cnt++]=x;
    
            for(int i=0;i<cnt;i++)
                for(int j=i+1;j<cnt;j++)
                {
                    int x=sta[i],y=sta[j];
                    g[x][y]=0;
                }
        }
    
        dijkstra();
    
        if(dist[n] == INF) puts("NO");
        else cout<<dist[n]<<endl;
    
        //system("pause");
    }
    

    其他解:
    将一条线路上的点之间的距离全设为\(1\),在此情况下求\(1->n\)的最短距离,最短距离减一即为换乘次数,边权全为\(1\),用\(bfs\)求最短路。

    const int N=510;
    int g[N][N];
    int dist[N];
    int sta[N];
    int n,m;
    
    int bfs()
    {
        memset(dist,-1,sizeof dist);
        queue<int> q;
        dist[1]=0;
        q.push(1);
    
        while(q.size())
        {
            int t=q.front();
            q.pop();
    
            if(t == n) return dist[t];
    
            for(int i=1;i<=n;i++)
                if(g[t][i] && dist[i] == -1)
                {
                    dist[i]=dist[t]+1;
                    q.push(i);
                }
        }
        return -1;
    }
    
    int main()
    {
        scanf("%d%d\n",&m,&n);
    
        while(m--)
        {
            string line;
            getline(cin,line);
            stringstream ss(line);
            int x,cnt=0;
            while(ss>>x) sta[cnt++]=x;
    
            for(int i=0;i<cnt;i++)
                for(int j=i+1;j<cnt;j++)
                {
                    int x=sta[i],y=sta[j];
                    g[x][y]=1;
                }
        }
    
        int t=bfs();
    
        if(t == -1) puts("NO");
        else cout<<max(t-1,0)<<endl;
    
        //system("pause");
    }
    
  • 相关阅读:
    Python发邮件的小脚本
    收集服务器网卡和IP信息
    Parent Proxy 和 Origin Server配置学习
    ATS 自定义日志格式
    css之选择器篇
    css之入门篇
    javascript必须懂之冒泡事件
    HTML5之语义化标签
    HTML之总结
    随堂笔记之正则与HTML5新元素
  • 原文地址:https://www.cnblogs.com/fxh0707/p/13735791.html
Copyright © 2011-2022 走看看