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型数组记录一下这两个草地见是否已经有路了,如果有的话直接

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

原文地址:https://www.cnblogs.com/lcyhaha/p/6399284.html