codeforces 24A Ring road DFS

本文介绍了一个关于城市间单行道路改造的问题。通过深度优先搜索算法,寻找最优路径,确保所有城市间的连通性,同时最小化改造成本。

题意:一个国家中的城市是像一个环一样的连起来的,由于马路改成单行道,连通性收到破坏。求最节省的修改方案,是每个城市直接都有通路。

做法:以城市1 为根节点,一次遍历左边,一次遍历右边,代价为sum(gra[i][j],tag[i][j]),gra记录改造费用,tag记录是这么走否需要改造。

#include <iostream>
#include <cstdio>
#include <cstring>
#define eps 1e8
#define LMT 102
using namespace std;
int n,ans,gra[LMT][LMT],tag[LMT][LMT];
void dfs(int u,int pre,int cost,int num)
{
    if(n<num)
    {
        cost+=tag[u][1]*gra[u][1];
        if(ans>cost)ans=cost;
        return ;
    }
    for(int j=1;j<=n;j++)
    if(gra[u][j]&&j!=pre)
    dfs(j,u,cost+tag[u][j]*gra[u][j],num+1);
}
int main()
{
    scanf("%d",&n);ans=eps;
    for(int i=1;i<=n;i++)
    {
        int u,v,c;
        scanf("%d%d%d",&u,&v,&c);
        gra[u][v]=gra[v][u]=c;
        tag[v][u]=1;
    }
    for(int j=1;j<=n;j++)
    if(gra[1][j])dfs(j,1,tag[1][j]*gra[1][j],2);
    printf("%d\n",ans);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值