zoukankan      html  css  js  c++  java
  • poj 1087 A Plug for UNIX

    题目描述:
    现在由你负责布置Internet联合组织首席执行官就职新闻发布会的会议室。
    由于会议室修建时被设计成容纳全世界各地的新闻记者,因此会议室提供了多种电源插座用
    以满足(会议室修建时期)各国不同插头的类型和电压。不幸的是,会议室是很多年前修建的,
    那时新闻记者很少使用电子设备,所以会议室对每种插座只提供了一个。新闻发布会时,新闻记
    者需要使用许多电子设备,如手提电脑,麦克风,录音机,传呼机等等。尽管这些设备很多可以
    使用电池,但是由于发布会时间很长并且是单调乏味的,记者们希望能够使用尽可能多的设备(这
    些设备需要使用插座),以打发时间。
    在发布会之前,你收集了记者们使用的设备的信息,开始布置会议室。你注意到有些设备的
    插头没有合适的插座可用。你怀疑这些设备来自那些在修建会议室时不存在的国家。对有些插座
    来说,有多个设备的插头可以使用。而对另一些插座来说,没有哪些设备的插头可以用得上。
    为了试图解决这个问题,你光顾了附近的商店,商店出售转换器,这些转换器可以将一种插
    头转换成另一种插头。而且转换器可以串联。商店没有足够多的转换器类型,满足所有的插头和
    插座的组合,但对于已有某种转换器,总是可以提供无限多个。

    // 将所有设备看成源点
    // 每当有 设备 插头 : dev1 plui 那么 cap[s][plui]++
    // 然后将n个插头连向汇点 流量为1
    // 对于转换器 对于 每个 plugi plugj cap[plugi][plugj]=INF
    // 把图画出来就清楚了

    // 求出最大流就是被使用的插座数

    #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <map> #include <math.h> #include <stdio.h> #include <string.h> #include <string> using namespace std; #define MOD 1000000007 #define INF 1000000000 #define maxn 520 #define maxm 48010 #define LL __int64//long long int M,K,C,N; int cap[maxn][maxn],flow[maxn][maxn]; int level[maxn]; bool BFS(int s,int t){ memset(level,0,sizeof(level)); queue<int> Q; int u; int i; Q.push(s); level[s]=1; while(!Q.empty()){ u=Q.front(); Q.pop(); if(u==t) return true; for(i=1;i<=t;i++) if(!level[i]&&cap[u][i]>flow[u][i]) { level[i]=level[u]+1; Q.push(i); } } return false; } int dfs(int u,int maxf,int t){ if(u==t||maxf==0) return maxf; int ret=0,f,i; for(i=1;i<=t;i++) if(cap[u][i]>flow[u][i]&&level[u]+1==level[i]){ f= dfs(i,min(maxf,cap[u][i]-flow[u][i]),t); flow[u][i]+=f; flow[i][u]-=f; maxf-=f; ret+=f; if(maxf==0) break; } return ret; } int Dinic(int s,int t){ int flow=0; while(BFS(s,t)){ flow+=dfs(s,INF,t); } return flow; } void init(){ memset(cap,0,sizeof(cap)); memset(flow,0,sizeof(flow)); } char s1[30],s2[30]; int main(){ int T; int i,j,k; int n,m,nu=0; // scanf("%d",&T); // while(T--){ map<string,int> mp; map<string,int>::iterator it; init(); scanf("%d",&n); // T=n; for(i=1;i<=n;i++){ scanf("%s",s1); it=mp.find(s1); if(it==mp.end()) mp[s1]=++nu; } n=nu;//printf("%d ",n); scanf("%d",&m); for(i=1;i<=m;i++){ scanf("%s %s",s1,s2); it=mp.find(s2); if(it!=mp.end()){ j=mp[s2]; cap[0][j]++; }else{ mp[s2]=++nu; cap[0][nu]++; } } scanf("%d",&k); while(k--){ scanf("%s %s",s1,s2); it=mp.find(s1); if(it==mp.end()) mp[s1]=++nu; it=mp.find(s2); if(it==mp.end()) mp[s2]=++nu; i=mp[s1]; j=mp[s2]; cap[i][j]=INF; } // printf("?"); for(i=1;i<=n;i++) cap[i][nu+1]=1; printf("%d ",m-Dinic(0,nu+1)); // } return 0; }
  • 相关阅读:
    Kali学习笔记38:文件上传漏洞
    Kali学习笔记37:APPSCAN
    Kali学习笔记36:AVWS10的使用
    Kali学习笔记35:使用VBScript、PowerShell、DEBUG传输文件
    Kali学习笔记34:配置TFTP和FTP服务
    《day13--异常的进阶和包的使用》
    《java作业》
    《day12---异常》
    《AppletButtonEvent.java》
    《CheckboxDemo.java》
  • 原文地址:https://www.cnblogs.com/372465774y/p/3227937.html
Copyright © 2011-2022 走看看