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