zoukankan      html  css  js  c++  java
  • 1375. 奶牛回家

    点数为(52),可以用(floyd)求出其他点到终点的距离,选择到终点距离最小的点输出即可。

    const int N = 55;
    int g[N][N];
    int n=52,m;
    
    int get(char c)
    {
        if(isupper(c)) return c-'A';
        return c-'a'+26;
    }
    
    void floyd()
    {
        for(int k=0;k<n;k++)
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
    }
    
    int main()
    {
        cin>>m;
    
        memset(g,0x3f,sizeof g);
        for(int i=0;i<n;i++) g[i][i]=0;
        
        while(m--)
        {
            char a,b;
            int c;
            cin>>a>>b>>c;
            int x=get(a),y=get(b);
            g[x][y]=g[y][x]=min(g[x][y],c);
        }
    
        floyd();
    
        int res=0;
        for(int i=0;i<25;i++)
            if(g[i][25] < g[res][25])
                res=i;
    
        cout<<char(res+'A')<<' '<<g[res][25]<<endl;
        //system("pause");
        return 0;
    }
    

    由于是无向图,所以可求出终点距离其余点的距离,这个距离和从其余点到终点的距离是相等的。

    用单源最短路(Dijkstra)算法,找到从终点出发距离最近的点。

    const int N = 55;
    int g[N][N];
    int dist[N];
    bool vis[N];
    int n=52,m;
    
    int get(char c)
    {
        if(isupper(c)) return c-'A';
        return c-'a'+26;
    }
    
    void dijkstra(int st)
    {
        memset(dist,0x3f,sizeof dist);
        dist[st]=0;
        
        for(int i=0;i<n;i++)
        {
            int t=-1;
            for(int j=0;j<n;j++)
                if(!vis[j] && (t == -1 || dist[t] > dist[j]))
                    t=j;
            
            vis[t]=true;
            
            for(int j=0;j<n;j++)
                dist[j]=min(dist[j],dist[t]+g[t][j]);
        }
    }
    
    int main()
    {
        cin>>m;
    
        memset(g,0x3f,sizeof g);
        for(int i=0;i<n;i++) g[i][i]=0;
    
        while(m--)
        {
            char a,b;
            int c;
            cin>>a>>b>>c;
            int x=get(a),y=get(b);
            g[x][y]=g[y][x]=min(g[x][y],c);
        }
    
        dijkstra(25);
    
        int res=0;
        for(int i=0;i<25;i++)
            if(dist[i] < dist[res])
                res=i;
    
        cout<<char(res+'A')<<' '<<dist[res]<<endl;
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    Hibernate常用查询
    Hibernate多对多
    Hibernate简单检索方式(查询方式)
    Hibernate入门代码
    Hibernate一对多
    什么是Hibernate
    SpirngMVC入门第一天
    Docker一键部署Hadoop心得(二)
    Docker一键部署Hadoop心得(一)
    安装Docker的三种方式
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14882106.html
Copyright © 2011-2022 走看看