zoukankan      html  css  js  c++  java
  • p1217晚餐(简单的dijkstra)

    题目:

    输入:

    1000 5 6
    1 2 300
    2 4 200
    3 4 600
    3 4 800
    5 3 100
    2 5 650

    输出:

     4

    这道题呢,其实就是用邻接矩阵将每条边耗费的体力存起来,然后用dijkstra算法求出每个牧场到Bessie所在的第一个牧场所耗费的最少时间,然后统计一下在

    t范围内的有几头奶牛即可。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int a[1100][1100];
    bool b[1100][1100];
    int dis[110000];
    bool vis[10000];
    int main()
    {
        int t,f,p;
        cin>>t>>f>>p;
        memset(a,10,sizeof(a));
        memset(b,false,sizeof(b));
        for(int i=1;i<=p;i++)
        {
            int xx,yy,zz;
            cin>>xx>>yy>>zz;
            if(b[xx][yy]==true||b[yy][xx]==true)
            {
                if(zz<a[xx][yy])
                    a[xx][yy]=zz;
            }
            if(b[xx][yy]==false)
            {
                a[xx][yy]=zz;
                a[yy][xx]=zz;
                b[xx][yy]=true;
            }
        }
        int sum=0;
        int maxx=-2;
        //for(int k=1;k<=f;k++)
        {
            for(int i=1;i<=f;i++)
                dis[i]=a[1][i];
            memset(vis,0,sizeof(vis));
            vis[1]=1;
            dis[1]=0;
            for(int i=1;i<f;i++)
            {
                int minn=9999999;
                int x=0;
                for(int j=1;j<=f;j++)
                {
                    if(!vis[j]&&(dis[j]<minn))
                    {
                        minn=dis[j];
                        x=j;
                    }
                }
                if(x==0)
                    break;
                vis[x]=1;
                for(int j=1;j<=f;j++)
                {
                    if(!vis[j]&&(dis[x]+a[x][j]<dis[j]))
                    {
                        dis[j]=dis[x]+a[x][j];
                    }                    
                }
            }
            sum=0;
            for(int i=1;i<=f;i++)
            {
                if(dis[i]<=t)
                    sum++;
            }
            if(sum>maxx)
            {
                maxx=sum;
            }
        }
        cout<<maxx<<endl;
        return 0;
    }

    输入时,因为我发现每两个牧场间会有重复的路,所以用bool型数组记录一下这两个草地见是否已经有路了,如果有的话直接

    从这两个重复的路中选出耗费体力最少的留下。

  • 相关阅读:
    在firefox里面查看AMF信息
    addFrameScript 修改自定义button 名字
    [转]游戏UI与flash 组件开发
    as 运算符 与 where T : class
    Process.Start传参
    站长工具
    SaveFileDialog使用方法
    iis admin service 无法设置 因为不是服务器?
    将文件夹层次显示在treeview控件中
    磁盘fat32转NTFS
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/6399284.html
Copyright © 2011-2022 走看看