NC14352旅行 最短路 暴力枚举

题目大意:
小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点。小z时间有限,只能在三个旅行景点进行游玩。小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城。
小z很开心,直接就把钱一次性缴足了。然而小z心机很重,他想选择的路程尽量长。
然而司机也很聪明,他每次从一个点走到另外一个点的时候都走最短路径。
你能帮帮小z吗?
需要保证这三个旅行景点一个作为起点,一个作为中转点一个作为终点。(一共三个景点,并且需要保证这三个景点不能重复).

思路:因为数据很小,所以先进行一次暴力把两点间的最短路求出来,因为是稀疏图所以用spfa暴力。题目要求的是三个点两条边的最长,所以枚举中转点,以每个中转点为起点,再找出两条最长的边就是答案。

#include<bits/stdc++.h>
using namespace std;
const int maxm=1010;
const int maxn=1010;
const int inf=0x3f3f3f3f;
int head[maxn],vis[maxn][maxn],dis[maxn][maxn];
int cnt,n,m;
struct node
{
    int to,next,l;
}e[maxm*2];
void add(int x,int y,int l)
{
    e[cnt].to=y;
    e[cnt].next=head[x];
    e[cnt].l=l;
    head[x]=cnt++;
}
void spfa(int s)
{
    queue<int> q;
    for(int i=0;i<=n;i++)
    {
        vis[s][i]=0;
        dis[s][i]=inf;
    }
    dis[s][s]=0;
    vis[s][s]=1;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[s][u]=0;
        for(int i=head[u];i!=-1;i=e[i].next)
        {
            int v=e[i].to;
            if(dis[s][v]>dis[s][u]+e[i].l)
            {
                dis[s][v]=dis[s][u]+e[i].l;
                if(!vis[s][v])
                {
                    vis[s][v]=1;
                    q.push(v);
                }
            }
        }
    }
}
void solve()
{
    int ans=-1,l1=0,l2=0;
    for(int i=1;i<=n;i++)spfa(i);
    for(int i=1;i<=n;i++)
    {
        l1=l2=0;
        for(int j=1;j<=n;j++)
        {
            if(i==j)continue;
            if(dis[i][j]>l1 && dis[i][j]!=inf)l2=l1,l1=dis[i][j];
            else if(dis[i][j]>l2 && dis[i][j]!=inf)l2=dis[i][j];
        }
        if(l1 && l2)ans=max(ans,l1+l2);
    }
    cout<<ans<<endl;
}
int main()
{
    int t,u,v,l;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));
        cnt=0;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&u,&v,&l);
            add(u,v,l);
            add(v,u,l);
        }
        solve();
    }
    return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要进行多个nc数据的公式计算,可以先将每个nc文件读入到R中,然后进行相应的计算,最后将结果输出到新的nc文件中。 以下是一个简单的示例代码,假设我们有个nc文件`data1.nc`、`data2.nc`和`data3.nc`,每个nc文件中都有一个名为`data`的变量,我们需要将这个变量相加,并将结果保存到新的nc文件`result.nc`中。 ```R library(ncdf4) # 读入第一个nc文件 nc_data1 <- nc_open("data1.nc") data1 <- ncvar_get(nc_data1, "data") dim1 <- dim(data1) # 读入第二个nc文件 nc_data2 <- nc_open("data2.nc") data2 <- ncvar_get(nc_data2, "data") dim2 <- dim(data2) # 读入第个nc文件 nc_data3 <- nc_open("data3.nc") data3 <- ncvar_get(nc_data3, "data") dim3 <- dim(data3) # 进行公式计算 result <- data1 + data2 + data3 # 创建新的nc文件 nc_new <- nc_create("result.nc") # 定义维度和变量 dimid1 <- nc_def_dim(nc_new, "dim1", dim1) dimid2 <- nc_def_dim(nc_new, "dim2", dim2) dimid3 <- nc_def_dim(nc_new, "dim3", dim3) varid <- nc_def_var(nc_new, "result", "double", c(dimid1, dimid2, dimid3)) # 写入数据 ncvar_put(nc_new, varid, result) # 关闭nc文件 nc_close(nc_new) nc_close(nc_data1) nc_close(nc_data2) nc_close(nc_data3) ``` 以上代码中,我们分别读入个nc文件,并将它们保存到变量`data1`、`data2`和`data3`中。然后,我们将这个变量相加,得到最终的结果`result`。接着,我们创建一个新的nc文件`result.nc`,定义维度和变量,并将结果写入到新的nc文件中。最后,我们关闭所有打开的nc文件。 需要注意的是,上述代码仅适用于个具有相同维度的nc文件进行简单的加法计算。如果你需要进行其他的计算,或者处理的nc文件具有不同的维度和变量,请根据具体情况修改代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值