zoukankan      html  css  js  c++  java
  • codevs 2494 Vani和Cl2捉迷藏

     由题意,每条路径上只能选一个点,也就是求最小路径法覆盖=节点数-最大匹配。

     为了保证联通,我们需要做一个闭包,也就是floyd。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #define maxv 205
    #define maxe 3005
    #define inf 12345678
    using namespace std;
    struct edge
    {
    int v,f,nxt;
    }e[maxe];
    int map[maxv][maxv],n,m,x,y,s,t,nume=1,dis[maxv],g[maxv];
    void addedge(int u,int v,int f)
    {
    e[++nume].v=v;
    e[nume].f=f;
    e[nume].nxt=g[u];
    g[u]=nume;
    e[++nume].v=u;
    e[nume].f=0;
    e[nume].nxt=g[v];
    g[v]=nume;
    }
    bool bfs()
    {
    for (int i=1;i<=2*n+1;i++)
    dis[i]=-1;
    queue <int> q;
    q.push(s);
    dis[s]=0;
    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 ((e[i].f>0) && (dis[v]==-1))
    {
    dis[v]=dis[head]+1;
    q.push(v);
    }
    }
    }
    if (dis[t]==-1) return false;
    return true;
    }
    int dinic(int x,int low)
    {
    if (x==t) return low;
    int ret=0;
    for (int i=g[x];low && i;i=e[i].nxt)
    {
    int v=e[i].v;
    if ((dis[v]==dis[x]+1) && (e[i].f>0))
    {
    int dd=dinic(v,min(e[i].f,low));
    e[i].f=e[i].f-dd;
    e[i^1].f=e[i^1].f+dd;
    low=low-dd;
    ret=ret+dd;
    }
    }
    if (ret==0) dis[x]=-1;
    return ret;
    }
    int main()
    {
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    for (int j=1;j<=n;j++)
    map[i][j]=inf;
    for (int i=0;i<=2*n+1;i++)
    g[i]=0;
    for (int i=1;i<=m;i++)
    {
    scanf("%d%d",&x,&y);
    map[x][y]=1;
    }
    for (int k=1;k<=n;k++)
    for (int i=1;i<=n;i++)
    for (int j=1;j<=n;j++)
    if (map[i][j]>map[i][k]+map[k][j])
    map[i][j]=map[i][k]+map[k][j];
    s=0;t=2*n+1;
    for (int i=1;i<=n;i++)
    {
    addedge(s,i,1);
    addedge(i+n,t,1);
    }
    for (int i=1;i<=n;i++)
    for (int j=1;j<=n;j++)
    {
    if (map[i][j]!=inf)
    addedge(i,j+n,1);
    }
    int max_flow=0;
    while (bfs()==true)
    max_flow=max_flow+dinic(s,inf);
    printf("%d ",n-max_flow);
    return 0;
    }

  • 相关阅读:
    CoreText实现图文混排
    iOS中的数据的存储方式
    获得自定义的所有相簿
    swift基础语法(31- swift可选类型)
    swift内存管理(30- Swift内存管理)
    swift基础语法(29- 析构方法)
    swift基础语法(27- 构造方法,带参数的构造方法,常量存储属性与构造方法,结构体构造方法)
    iOS --旋转动画
    iOS--UILabel上画横线
    iOS--(转)集成银联3.3.0
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5095795.html
Copyright © 2011-2022 走看看