codeforces 543B Destroying Roads

直接枚举公共路径。。。。。注意细节(i->j,j->i)。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxv 3050
#define maxe 6050
#define inf 2000000000
using namespace std;
int n,m,x,y,s1,t1,l1,s2,t2,l2,dis[maxv][maxv],ans=inf,g[maxv],nume=0;
bool vis[maxv];
queue <int> q;
struct edge
{
    int v,nxt;
}e[maxe];
void addedge(int u,int v)
{
    e[++nume].v=v;
    e[nume].nxt=g[u];
    g[u]=nume;
}
void bfs(int x)
{
    for (int i=1;i<=n;i++) {vis[i]=false;dis[x][i]=inf;}
    q.push(x);dis[x][x]=0;vis[x]=true;
    while (!q.empty())
    {
        int head=q.front();q.pop();
        for (int i=g[head];i;i=e[i].nxt)
        {
            int v=e[i].v;
            if (!vis[v])
            {
                vis[v]=true;dis[x][v]=dis[x][head]+1;
                q.push(v);
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        addedge(x,y);addedge(y,x);
    }
    scanf("%d%d%d",&s1,&t1,&l1);
    scanf("%d%d%d",&s2,&t2,&l2);
    for (int i=1;i<=n;i++) bfs(i);
    if ((dis[s1][t1]==inf) || (dis[s2][t2]==inf)) {printf("-1
");return 0;}
    for (int i=1;i<=n;i++)
        for (int j=i;j<=n;j++)
        {
            if ((dis[s1][i]+dis[i][j]+dis[j][t1]<=l1) && (dis[s2][i]+dis[i][j]+dis[j][t2]<=l2))
                ans=min(ans,dis[s1][i]+dis[s2][i]+dis[j][t1]+dis[j][t2]+dis[i][j]);
            if ((dis[s1][i]+dis[i][j]+dis[j][t1]<=l1) && (dis[s2][j]+dis[j][i]+dis[i][t2]<=l2))
                ans=min(ans,dis[s1][i]+dis[s2][j]+dis[j][t1]+dis[i][t2]+dis[i][j]);
            if ((dis[s1][j]+dis[j][i]+dis[i][t1]<=l1) && (dis[s2][i]+dis[i][j]+dis[j][t2]<=l2))
                ans=min(ans,dis[s1][j]+dis[s2][i]+dis[i][t1]+dis[j][t2]+dis[i][j]);
            if ((dis[s1][j]+dis[j][i]+dis[i][t1]<=l1) && (dis[s2][j]+dis[j][i]+dis[i][t2]<=l2))
                ans=min(ans,dis[s1][j]+dis[s2][j]+dis[i][t1]+dis[i][t2]+dis[i][j]);
        }
    if ((dis[s1][t1]<=l1) && (dis[s2][t2]<=l2)) ans=min(ans,dis[s1][t1]+dis[s2][t2]);
    if (ans==inf) printf("-1
");
    else printf("%d
",m-ans);
    return 0;
}
原文地址:https://www.cnblogs.com/ziliuziliu/p/5937453.html