涉及算法:dfs
题目大意:网络中有n台电脑,给出一个矩阵C表示电脑两两间通信需要的流量,例如C[i][j]=70表示电脑i和电脑j通信需要的流量为70,现在将电脑分成两个集合,只有在不能集合中的电脑才需要通信,相同集合中的电脑不需要通信,问:最大的通信流量是多少。
题目分析:将电脑分为两个集合:集合0和集合1,每台电脑用两种选择,要么加入集合1要么加入集合2,这显然是一个双入口的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);
}
}
}