到了雨季农业生产的排涝就成了一个大问题。为了保证植物生长的顺利,某县政府决定投资为农田区建立一些排涝渠,将农田里多余的水排到小溪里。
输入第1行包括用一个空格分隔的两个整数N和M,N表示县政府专家设计的排涝渠的数量,M是排涝渠交叉点的数量。其中第一个交点是农田区,交点M是小溪(0≤N≤200,2≤M≤200)。第2行-第N+1行中每行有三个用空格分隔的整数,Si、Ei和Ci。Si和Ei说明了排涝渠的端点,多余的水自Si流向Ei;Ci是这个第i条排涝渠的最大排水量。(1≤Si,Ei≤M,0≤Ci≤10000000)
输出只有一个,为规划好的排涝渠的最大流量。
样例输入
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
样例输出
50
代码:
import java.util.Scanner;
public class PaiLao {
static int n;
static int [][]map;
static int m;
static int way[];
static boolean isvisited[];
static int MAX=Integer.MAX_VALUE;
static int sum;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
m=scanner.nextInt();
map=new int [n+1][n+1];
way=new int[n+1];
isvisited=new boolean [n+1];
//初始化map
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
map[i][j]=MAX;
}
}
for(int i=1;i<=n;i++)
{
int a=scanner.nextInt();
int b=scanner.nextInt();
int c=scanner.nextInt();
map[a][b]=c;
}
dfs(1,1);
System.out.println(sum);
}
private static void dfs(int u,int i) {
way[i]=u;//记录每一步所走的节点
isvisited[u]=true;
if(u==m)
{
// for(int j=1;j<=i;j++)
// {
// System.out.print(way[j]+" ");
// }
// System.out.println();
int min=MAX;
for(int j=1;j<i;j++)
{
int a=way[j];
int b=way[j+1];
if(min>map[a][b])
min=map[a][b];
}
sum+=min;
}
else{
for(int j=1;j<=m;j++)//寻找下一个可到达的点
{
if(isvisited[j]==true||map[u][j]==MAX)//j点已经访问过或者j点不能到达
continue;
dfs(j, i+1);
isvisited[j]=false;
}
}
}
}