CodeForces 24A Ring road :给定一个环改变最小花费使联通 :dfs

其实就两个方向,不符合就改嘛

所以从任意一个点开始,两个方向更改的最小值就是答案==

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,vis[1005];
 6 struct dian{
 7   int num1,num2,to1,to2,value1,value2;
 8 }a[10005];
 9 int dfs(int pre,int now,int num,int to,int value)
10 {
11   if (num>n) return value;
12   if (a[now].num1!=pre){
13     if (a[now].to1==1) return dfs(now,a[now].num1,num+1,to,value);
14     else return dfs(now,a[now].num1,num+1,to,value+a[now].value1);
15   }
16   else{
17     if (a[now].to2==1) return dfs(now,a[now].num2,num+1,to,value);
18     else return dfs(now,a[now].num2,num+1,to,value+a[now].value2);
19   }
20 }
21 int main()
22 {
23   int ans,i,x,y,w,tmp;
24   scanf("%d",&n);
25   memset(vis,0,sizeof(vis));
26   for (i=1;i<=n;i++)
27   {
28     scanf("%d%d%d",&x,&y,&w);
29     if (vis[x]==0) a[x].num1=y,a[x].to1=1,a[x].value1=w;
30     else a[x].num2=y,a[x].to2=1,a[x].value2=w;
31     if (vis[y]==0) a[y].num1=x,a[y].to1=-1,a[y].value1=w;
32     else a[y].num2=x,a[y].to2=-1,a[y].value2=w;
33     vis[x]=vis[y]=1;
34   }
35   ans=0x3f3f3f3f;
36   tmp=0;
37   if (a[1].to1==-1) tmp+=a[1].value1;
38   ans=min(ans,dfs(1,a[1].num1,2,a[1].to1,tmp));
39   tmp=0;
40   if (a[1].to2==-1) tmp+=a[1].value2;
41   ans=min(ans,dfs(1,a[1].num2,2,a[1].to2,tmp));
42   printf("%d\n",ans);
43 }
View Code

题目链接:http://codeforces.com/problemset/problem/24/A

posted on 2015-03-25 20:48  xiao_xin  阅读(299)  评论(0编辑  收藏  举报

导航