JSOI 2008 星球大战

来源:互联网 发布:数控编程人员工资待遇 编辑:程序博客网 时间:2024/05/02 04:28

倒着做并查集

模块的统计方法比较巧妙

import java.util.*;import java.io.*;class edge{    int x,y,next;    public edge(int a, int b, int c){        x=a;y=b;next=c;    }}class problem12{    int n,m,k;    int header[];    edge arr[];    int table[];    int target[];    int total;    void solver() throws IOException{        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        StringTokenizer st = new StringTokenizer(reader.readLine().trim());        n = Integer.parseInt(st.nextToken());        m = Integer.parseInt(st.nextToken());        header = new int[n];        arr = new edge[2*m];        table = new int[n];        for(int i=0;i<n;i++){            table[i] = i;        }        int index = 0;        Arrays.fill(header, -1);        for(int i=0;i<m;i++){            st = new StringTokenizer(reader.readLine().trim());            int x = Integer.parseInt(st.nextToken());            int y = Integer.parseInt(st.nextToken());            arr[index] = new edge(x,y,header[x]);            header[x] = index++;            arr[index] = new edge(y,x,header[y]);            header[y] = index++;        }        k = Integer.parseInt(reader.readLine().trim());        target = new int[k];        int result[] = new int[k+1];        for(int i=0;i<k;i++){            int tmp = Integer.parseInt(reader.readLine().trim());            target[i] = tmp;            table[tmp] = -1;        }        total = n-k;        for(int i=0;i<2*m;i++){            if(table[arr[i].x]!=-1&&table[arr[i].y]!=-1){                union(arr[i].x,arr[i].y);            }        }        result[k] = total;        for(int i=k-1;i>=0;i--){            int node = target[i];            table[node] = node;            total++;            for(int j=header[node];j!=-1;j=arr[j].next){                if(table[arr[j].y]!=-1){                    union(arr[j].x, arr[j].y);                }            }            result[i] = total;        }        for(int i=0;i<k+1;i++){            System.out.println(result[i]);        }    }    void union(int x, int y){        x=find(x);        y=find(y);        if(x==y) return;        if(x<y) table[y]=x;        else table[x]=y;        total--;    }    int find(int x){        if(table[x]!=x&&table[x]>=0){            table[x] = find(table[x]);        }        return table[x];    }}public class tour{    public static void main (String [] args) throws Exception {        problem12 p = new problem12();        p.solver();    }}


0 0
原创粉丝点击