zoukankan      html  css  js  c++  java
  • 网络流,设备、插头和转接器建图(简单map的应用)

    题意:

    给你n个插座,m个设备,每台设备都有对应的插座,有k个转接器。

    要求:求满足不能插上插座的用电器最少个数 

    solution:

    HINT:每种适配器都有无限个,所以建图的时候要改为INF。

    答案为m-idnic()

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<algorithm>
      4 #include<vector>
      5 #include<queue>
      6 #include<map>
      7 #include<cstring>
      8 #define mp make_pair
      9 #define pb push_back
     10 #define first fi
     11 #define second se
     12 #define pw(x) (1ll << (x))
     13 #define sz(x) ((int)(x).size())
     14 #define all(x) (x).begin(),(x).end()
     15 #define rep(i,l,r) for(int i=(l);i<(r);i++)
     16 #define per(i,r,l) for(int i=(r);i>=(l);i--)
     17 #define FOR(i,l,r) for(int i=(l);i<=(r);i++)
     18 #define eps 1e-9
     19 #define PIE acos(-1)
     20 #define cl(a,b) memset(a,b,sizeof(a))
     21 #define fastio ios::sync_with_stdio(false);cin.tie(0);
     22 #define lson l , mid , ls
     23 #define rson mid + 1 , r , rs
     24 #define ls (rt<<1)
     25 #define rs (ls|1)
     26 #define INF 0x3f3f3f3f
     27 #define LINF 0x3f3f3f3f3f3f3f3f
     28 #define freopen freopen("in.txt","r",stdin);
     29 #define cfin ifstream cin("in.txt");
     30 #define lowbit(x) (x&(-x))
     31 #define sqr(a) a*a
     32 #define ll long long
     33 #define ull unsigned long long
     34 #define vi vector<int>
     35 #define pii pair<int, int>
     36 #define dd(x) cout << #x << " = " << (x) << ", "
     37 #define de(x) cout << #x << " = " << (x) << "
    "
     38 #define endl "
    "
     39 using namespace std;
     40 int n,m,k;
     41 const int maxn=505;
     42 map<string,int>ids; 
     43 
     44 struct Edge{
     45     int u,v,cap;
     46 };
     47 int S,T;
     48 vi G[maxn];
     49 int dep[maxn]; 
     50 vector<Edge> edge;
     51 inline int id(string s)
     52 {
     53     int m=sz(ids);
     54     if(ids.count(s))return ids[s];
     55     return ids[s]=m; 
     56 }
     57 
     58 void addedge(int u,int v,int cap)
     59 {
     60     edge.pb((Edge){u,v,cap});
     61     edge.pb((Edge){v,u,0});
     62     int t=sz(edge);
     63     G[u].pb(t-2);
     64     G[v].pb(t-1);
     65 }
     66 
     67 bool bfs()
     68 {
     69     cl(dep,-1);
     70     int Q[maxn]; 
     71     int h=0,t=1;dep[S]=0;Q[t]=S;
     72     while(h<t){
     73 //        de(T);
     74         int x=Q[++h];
     75         if(x==T)return 1;
     76         rep(i,0,sz(G[x])){
     77             Edge& e=edge[G[x][i]];
     78 //            de(e.v);puts("here");
     79             if(dep[e.v]==-1&&e.cap){
     80                 dep[e.v]=dep[x]+1;
     81                 Q[++t]=e.v;
     82             }
     83         }
     84     }
     85     return 0;
     86 }
     87 int dfs(int x,int f)
     88 {
     89     if(x==T)return f;
     90     int used=0,t;
     91     rep(i,0,sz(G[x])){
     92         Edge& e=edge[G[x][i]];
     93 //        dd(e.u),de(e.v);
     94         if(e.cap&&dep[e.v]==dep[x]+1){
     95             t=dfs(e.v,min(e.cap,f));
     96             e.cap-=t;edge[G[x][i]^1].cap+=t;
     97             used+=t;f-=t;
     98             if(!f)return used;
     99         }
    100     }
    101     if(!used)dep[x]=-1;
    102     return used;
    103 }
    104 int dinic()
    105 {
    106     int ans=0;
    107     while(bfs())ans+=dfs(S,INF);
    108     return ans;
    109 }
    110 void mapping()
    111 {
    112     S=0;
    113     string in[maxn],out[maxn];id("S");
    114     cin>>n;
    115     FOR(i,1,n)cin>>in[i];
    116     cin>>m;
    117     FOR(i,n+1,n+m)cin>>in[i]>>out[i],addedge(0,id(in[i]),1),addedge(id(in[i]),id(out[i]),1);
    118     cin>>k;
    119     FOR(i,n+m+1,n+m+k)cin>>in[i]>>out[i],addedge(id(in[i]),id(out[i]),INF);
    120 //    FOR(i,1,n)dd(in[i]),de(id(in[i]));
    121     T=n+m+k+1;
    122     FOR(i,1,n)addedge(id(in[i]),T,1);
    123 }
    124 int main()
    125 {
    126     mapping();
    127     cout<<m-dinic()<<endl;
    128     return 0;
    129 }
    View Code
  • 相关阅读:
    javascript如何判断一个对象是不是数组
    Socket 通讯
    XML 文件解析
    iOS 钥匙串 指纹识别 get和Post请求的区别
    MOS X 下Apache服务器配置,及日志读取
    iOS中图片动画的三种模式及基本的代码实现
    UI中 frame 与 transform的用法与总结
    Xcode 缓存 帮助文档 隐藏文件夹显示方法
    NSDate用法整理总结
    iOS沙盒机制的基本操作总结
  • 原文地址:https://www.cnblogs.com/klaycf/p/9726580.html
Copyright © 2011-2022 走看看