CF图论一--Ring road--DFS

本文探讨了如何通过重新定向有向图中的边来形成一个环图,使得总成本最小。利用深度优先搜索(DFS)算法,从第一个节点出发遍历所有可能的路径组合,寻找最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. Ring road

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Nowadays the one-way traffic is introduced all over the world in order to improve driving safety and reduce traffic jams. The government of Berland decided to keep up with new trends. Formerly all n cities of Berland were connected by n two-way roads in the ring, i. e. each city was connected directly to exactly two other cities, and from each city it was possible to get to any other city. Government of Berland introduced one-way traffic on all n roads, but it soon became clear that it's impossible to get from some of the cities to some others. Now for each road is known in which direction the traffic is directed at it, and the cost of redirecting the traffic. What is the smallest amount of money the government should spend on the redirecting of roads so that from every city you can get to any other?

Input

The first line contains integer n (3 ≤ n ≤ 100) — amount of cities (and roads) in Berland. Next n lines contain description of roads. Each road is described by three integers aibici (1 ≤ ai, bi ≤ n, ai ≠ bi, 1 ≤ ci ≤ 100) — road is directed from city aito city bi, redirecting the traffic costs ci.

Output

Output single integer — the smallest amount of money the government should spend on the redirecting of roads so that from every city you can get to any other.

Examples

input

Copy

3
1 3 1
1 2 1
3 2 1

output

Copy

1

input

Copy

3
1 3 1
1 2 5
3 2 1

output

Copy

2

input

Copy

6
1 5 4
5 3 8
2 4 15
1 6 16
2 3 23
4 6 42

output

Copy

39

input

Copy

4
1 2 9
2 3 8
3 4 7
4 1 5

output

Copy

0

给出一个图,原本他们是互相连通的,现在他们的有向图,问再连通几条边所用权值最小且是环图。

用DFS,从第一个点开始搜索。

#include<bits/stdc++.h>
using namespace std;
#define maxn 100+66
int edge[maxn][maxn];
int flag=0;
int tmp;
int n;
int vis[maxn];
int ans;
int minn;
void dfs(int s,int t,int sum,int step)
{
    if(s==t&&step==n)
    {
        minn=min(minn,sum);
        return;
    }
    for(int i=1; i<=n; i++)
    {
        if(vis[i])continue;
        if(edge[t][i]==0&&edge[i][t]!=0)
        {
            vis[i]=1;
            dfs(s,i,sum+edge[i][t],step+1);
            vis[i]=0;
        }
        if(edge[t][i]!=0)
        {
            vis[i]=1;
            dfs(s,i,sum,step+1);
            vis[i]=0;
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(edge,0,sizeof(edge));
        for(int i=1; i<=n; i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            //路是单向的
            edge[u][v]=w;
        }
        minn=9999999;
        dfs(1,1,0,0);
        printf("%d\n",minn);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值