列表

详情


NC50772. B题

描述

有一个连通图 包含 n 个点 n 条无向边 其中每个点都与其他的两个点直接相连 (即这是一个环)
现在这个环的边变成了有向边 变成了有向边后得到的有向图不一定是强连通的 
(强连通图是指一个有向图中任意两点v1、v2间存在v1到v2的路径及v2到v1的路径的图)

所以现在给出 n 条有向边和把某条有向边转换方向后的代价, 问要使输入的有向图变成一个强连通图
例如输入
3
1 3 1
1 2 1
3 2 1
表示有一条有向边 1 -> 3 如果把这条边变成 3 -> 1 的代价是 1
表示有一条有向边 1 -> 2 如果把这条边变成 2 -> 1 的代价是 1
表示有一条有向边 3 -> 2 如果把这条边变成 2 -> 3 的代价是 1
对于输入的这个有向图是不存在 2 -> 3 的路径的 所以可以把 有向边 1 -> 2 变为 2 -> 1 这样图中任意两点均相互可达

输入描述

多组测试数据。

第一行给出数字n,代表顶点数量 (3 ≤ n ≤ 100)。

接下来n行给出路径。

每行给出三个数字ai, bi, ci (1 ≤ ai, bi ≤ n, ai ≠ bi, 1 ≤ ci ≤ 100) — 代表ai指向bi。代价是ci。

输出描述

输出最小代价

示例1

输入:

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

输出:

1
2
39

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 492K, 提交时间: 2020-04-05 15:23:58

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int AX = 1e2 + 66 ; 
int n ;
int a[AX][AX];
int res ; 
void dfs( int x , int pre , int num , int sum ){
	if( num == n + 1 ){
		res = min( res , sum );
		return ; 
	}
	for( int i = 1 ; i <= n ; i++ ){
		if( a[x][i] >= 0 && i != pre ){
			dfs( i , x , num + 1 , sum + a[x][i] );
		}
	}
}
int main() {
	int x , y , w ; 
	while( ~scanf("%d",&n) ){
		memset( a , -1 , sizeof(a) ) ;
		res = INF ; 
		for( int i = 0 ; i < n ; i++ ){
			scanf("%d%d%d",&x,&y,&w);
			a[y][x] = w ;
			a[x][y] = 0 ; 
		}
		dfs( 1 , -1 , 1 , 0 );
		printf("%d\n",res);
	}
	return 0 ;
}

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 376K, 提交时间: 2019-07-10 13:17:07

#include<bits/stdc++.h>
using namespace std;
struct node{
	int v,cnt;
};
const int MAXN=111;
vector<node>g[MAXN];
int a,b,c,n,ans;
void dfs(int x,int father,int sum)
{
	if(x==1) {ans=min(ans,sum);return ;}
	for(int i=0;i<g[x].size();++i)	
	{
		if(g[x][i].v==father) continue;
		dfs(g[x][i].v,x,sum+g[x][i].cnt);
	}
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		memset(g,0,sizeof(g));
		ans=0x3f3f3f3f;
		for(int i=0;i<n;++i)
		{
			scanf("%d %d %d",&a,&b,&c);
			g[a].push_back({b,0});
			g[b].push_back({a,c});
		}
		for(int i=0;i<g[1].size();++i) dfs(g[1][i].v,1,g[1][i].cnt);
		printf("%d\n",ans);
	}
}

上一题