codeforces543B. Destroying Roads(暴力枚舉bfs)

//暴力枚舉所有點爲起點的最小值
//然後枚舉每段<i,j>是否爲重疊區域。
//之前想枚舉每一小段,發現很麻煩,其實重疊的區域肯定只有一段,因爲如果有兩段,那麼這兩段一定是由最短的路連接的,實際還是一段。
//所以枚舉一大段即可
import java.io.*;
import java.util.*;

public class cf {
    FastScanner in;
    final int INF=0x3fffffff;
    
    int[][] dis;
    edge[] e;
    int head[];
    int cnt=0;
    void addedge(int u,int v){
        e[cnt]=new edge();
        e[cnt].from=u;e[cnt].to=v;e[cnt].next=head[u];
        head[u]=cnt++;
    }
    void input(){
        in = new FastScanner(System.in);
        int n=in.nextInt();
        int m=in.nextInt();
        dis=new int[3010][3010];
        e=new edge[6010];
        head=new int[3010];
        cnt=0;
        Arrays.fill(head, -1);
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++)
                dis[i][j]=INF;
        
        for(int i=0;i<m;i++){
            int u=in.nextInt();
            int v=in.nextInt();
            addedge(u,v);
            addedge(v,u);
        }
        int s1=in.nextInt();
        int t1=in.nextInt();
        int l1=in.nextInt();
        int s2=in.nextInt();
        int t2=in.nextInt();
        int l2=in.nextInt();
        for(int i=1;i<=n;i++){
            bfs(i);// calculate everypoint's shortest distance
        }   
        int ans=-1;
        if(dis[s1][t1]<=l1&&dis[s2][t2]<=l2){
            ans=m-dis[s1][t1]-dis[s2][t2];
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(i==j)continue;
                    if(dis[s1][i]+dis[i][j]+dis[j][t1]<=l1&&dis[s2][i]+dis[i][j]+dis[j][t2]<=l2){
                        ans=Math.max(ans,m-dis[s1][i]-dis[s2][i]-dis[i][j]-dis[j][t1]-dis[j][t2]);
                    }
                    if(dis[t1][i]+dis[i][j]+dis[j][s1]<=l1&&dis[s2][i]+dis[i][j]+dis[j][t2]<=l2){
                        ans=Math.max(ans,m-dis[t1][i]-dis[s2][i]-dis[i][j]-dis[j][s1]-dis[j][t2]);
                    }
                }
            }
        }
        System.out.println(ans);
    }
    void bfs(int s){
        int Q[]=new int[3010];
        int front,rear;
        front=rear=0;
        boolean vis[]=new boolean[3010];
        Q[rear++]=s;vis[s]=true;
        dis[s][s]=0;
        while(front!=rear){
            int k=Q[front++];
            for(int i=head[k];i!=-1;i=e[i].next){
                int v=e[i].to;
                if(vis[v]==false){
                    vis[v]=true;
                    Q[rear++]=v;
                    dis[s][v]=dis[s][k]+1;              
                }
            }           
        }   
    }
    public static void main(String[] args){
        new cf().input();
    }
}
class edge{
    int from,to,next;
}
class FastScanner {
    BufferedReader br;
    StringTokenizer st;

    public FastScanner(File f) {
        try {
            br = new BufferedReader(new FileReader(f));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public FastScanner(InputStream f) {
        br = new BufferedReader(new InputStreamReader(f));
    }

    String next() {
        while (st == null || !st.hasMoreTokens()) {
            String s = null;
            try {
                s = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (s == null)
                return null;
            st = new StringTokenizer(s);
        }
        return st.nextToken();
    }

    boolean hasMoreTokens() {
        while (st == null || !st.hasMoreTokens()) {
            String s = null;
            try {
                s = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (s == null)
                return false;
            st = new StringTokenizer(s);
        }
        return true;
    }

    int nextInt() {
        return Integer.parseInt(next());
    }

    long nextLong() {
        return Long.parseLong(next());
    }

    double nextDouble() {
        return Double.parseDouble(next());
    }
    String nextLine() {
        
        String str = "";
        try {
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }
}

發佈了124 篇原創文章 · 獲贊 46 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章