usaco 4.1.3 Fence Loops (floyd)做法
来源:互联网 发布:mysql创建数据库 编辑:程序博客网 时间:2024/06/08 00:44
/*ID: daniel.20LANG: JAVATASK: fence6*/import java.util.*;import java.io.*;class segment{ int id; int len; int left_connects[] = new int[202]; int right_connects[] = new int[202]; int left_node = 0; int right_node = 0; public segment(int a, int b){ id=a; len=b; } public void add_left(int a){ left_connects[a]=1; } public void add_right(int a){ right_connects[a]=1; } public void tosString(){ System.out.println(left_node+" "+right_node+" "+len); }}class problem2{ segment arr[] = new segment[101]; int table[][] = new int[201][201]; int dis[][] = new int[201][201]; StringBuilder sb = new StringBuilder(); void solver() throws IOException{ long start = System.currentTimeMillis(); BufferedReader reader = new BufferedReader(new FileReader("fence6.in")); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("fence6.out"))); int n = Integer.valueOf(reader.readLine()); for(int i=1;i<=n;i++){ StringTokenizer st = new StringTokenizer(reader.readLine()); int t = Integer.valueOf(st.nextToken()); arr[t] = new segment(t,Integer.valueOf(st.nextToken())); st = new StringTokenizer(reader.readLine()); while(st.hasMoreTokens()){ arr[t].add_left(Integer.valueOf(st.nextToken())); } st = new StringTokenizer(reader.readLine()); while(st.hasMoreTokens()){ arr[t].add_right(Integer.valueOf(st.nextToken())); } } for(int i=0;i<201;i++){ Arrays.fill(table[i], 99999999); } arr[1].left_node=1; arr[1].right_node = 2; int index = 3; for(int i=1;i<=n;i++){ for(int j=0;j<arr[i].left_connects.length;j++){ if(arr[i].left_connects[j]==1){ if(arr[j].left_connects[i]==1){ arr[j].left_node=arr[i].left_node; } if(arr[j].right_connects[i]==1){ arr[j].right_node=arr[i].left_node; } if(arr[j].left_node==0) arr[j].left_node=index++; if(arr[j].right_node==0) arr[j].right_node=index++; } } for(int j=0;j<arr[i].right_connects.length;j++){ if(arr[i].right_connects[j]==1){ if(arr[j].left_connects[i]==1){ arr[j].left_node=arr[i].right_node; } if(arr[j].right_connects[i]==1){ arr[j].right_node=arr[i].right_node; } if(arr[j].left_node==0) arr[j].left_node=index++; if(arr[j].right_node==0) arr[j].right_node=index++; } } } for(int i=1;i<=n;i++){ table[arr[i].left_node][arr[i].right_node] = arr[i].len; table[arr[i].right_node][arr[i].left_node] = arr[i].len; } int result = floyd(index); System.out.println(result); sb.append(result); pw.println(sb.toString()); pw.close(); System.out.println("$:"+(System.currentTimeMillis()-start)); System.exit(0); } int floyd(int index){ int result = Integer.MAX_VALUE; for(int i=0;i<201;i++){ for(int j=0;j<201;j++){ dis[i][j] = table[i][j]; } } for(int k=1;k<index;k++){ for(int i=1;i<k;i++){ for(int j=i+1;j<k;j++){ if(dis[i][j]+table[i][k]+table[k][j]<result){ result = dis[i][j]+table[i][k]+table[k][j]; } } } for(int i=1;i<index;i++){ for(int j=1;j<index;j++){ dis[i][j] = Math.min(dis[i][j], dis[i][k]+dis[k][j]); } } } return result; }}public class fence6 { public static void main(String[] args) throws Exception { problem2 p = new problem2(); p.solver(); }}
之前用dijkstra做了一下,后来知道floyd其实也可以求最小环,
其实这个算法很有美感,真的很巧妙的做法
0 0
- usaco 4.1.3 Fence Loops (floyd)做法
- usaco 4.1.3 Fence Loops
- usaco 4.1 Fence Loops(floyd求最小环)
- USACO 4.1.3 Fence Loops解题报告
- USACO 4.1 Fence Loops (fence6)
- USACO Section 4.1 Fence Loops
- 【USACO题库】4.1.3 Fence Loops篱笆回路
- USACO-Section 4.1 Fence Loops (无向图最小环[Dijkstra||Floyd])
- usaco 4.1 Fence Loops 最小环
- USACO 4.1 Fence Loops 最小环
- usaco Fence Loops
- usaco Fence Loops
- USACO Fence Loops 解题报告
- USACO Section 4.1 Fence Loops - 简单深搜~
- C++——【USACO 4.1.2】——Fence Loops
- Section 4.1 Fence Loops
- Fence Loops
- USACO 4.1 Fence loop
- Android编译系统详解(二)——命令执行流程
- 叶子华戒烟经历:如果处理被阻塞的马桶
- codechef Carvans 题解
- Android编译系统详解(三)——编译流程详解
- mod_jk模块的总体功能
- usaco 4.1.3 Fence Loops (floyd)做法
- C语言 static的作用
- 获取所有应用
- Android反编译查看APK的源代码、资源文件、XML文件
- VB.NET总结
- 最长单调递增子序列的三种解法
- 安卓四大组件之Activity
- apache如何一个ServerName对应多个DocumentRoot
- C语言学习笔记与总结(一)