poj2531

来源:互联网 发布:淘宝开店 知乎 编辑:程序博客网 时间:2024/06/05 19:46
涉及算法:dfs
题目大意:网络中有n台电脑,给出一个矩阵C表示电脑两两间通信需要的流量,例如C[i][j]=70表示电脑i和电脑j通信需要的流量为70,现在将电脑分成两个集合,只有在不能集合中的电脑才需要通信,相同集合中的电脑不需要通信,问:最大的通信流量是多少。
题目分析:将电脑分为两个集合:集合0和集合1,每台电脑用两种选择,要么加入集合1要么加入集合2,这显然是一个双入口的dfs
代码如下:
package com.solo.in;import java.util.Scanner;public class Main_2531_1{static int n;static int c[][];public static void main(String[] args){Scanner in=new Scanner(System.in);n=in.nextInt();set=new int[n];c=new int[n][n];sum=0;max=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){c[i][j]=in.nextInt();}}dfs(0,0);System.out.println(max);}static int set[];static int sum;static int max;/*如用1耗时7000+,用2耗时1000+*/static void dfs(int id,int sum){if(id==n){/*1*///sum=0;//for(int i=0;i<n;i++)//{//for(int j=0;j<n;j++)//{//if(set[i]==0 && set[j]==1)//{//sum+=c[i][j];//}//}//}//if(sum>max)//{//max=sum;//}if(sum>max){max=sum;}return;}for(int i=1;i>=0;i--){/*2*/int tmp=sum;if(i==1){for(int j=0;j<n;j++){if(set[j]==1){tmp-=c[id][j];}else {tmp+=c[id][j];}}}/**/set[id]=i;dfs(id+1,tmp);}}}


0 0
原创粉丝点击