题意:一个国家中的城市是像一个环一样的连起来的,由于马路改成单行道,连通性收到破坏。求最节省的修改方案,是每个城市直接都有通路。
做法:以城市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;
}