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 }