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");
    }
    
  • 相关阅读:
    HDU 4611 Balls Rearrangement 数学
    Educational Codeforces Round 11 D. Number of Parallelograms 暴力
    Knockout.Js官网学习(简介)
    Entity Framework 关系约束配置
    Entity Framework Fluent API
    Entity Framework DataAnnotations
    Entity Framework 系统约定配置
    Entity Framework 自动生成CodeFirst代码
    Entity Framework CodeFirst数据迁移
    Entity Framework CodeFirst尝试
  • 原文地址:https://www.cnblogs.com/fxh0707/p/13735791.html
Copyright © 2011-2022 走看看