753 - A Plug for UNIX (最大流或二分图匹配)

53 篇文章 0 订阅
27 篇文章 0 订阅

紫书上网络流部分的第一道例题,  刚刚学了最大流,还没有理解二分图匹配 , 这里就只说一下我用最大流是怎么做的吧 。

我们可以假想一个源点,一个汇点,然后对于每一个设备的插头,从源点连一条线,对于每个插座,连一条线到汇点,且容量都为1 。 然后对于每一个转换器,从原插头到变换后的插头连一条边,因为转换器数量无穷大,所以容量为无穷大 。 

这样我们就将原问题抽象成了最大流问题,巧妙的将出入路径的容量赋值为1,以此来让每一个设备匹配到唯一一个容器 。紫书上说这是二分图匹配,也许也暗含着其原理吧  。

最大流问题好像适合解决那种匹配问题, 因为其无序性,我们很难定义阶段,而且状态还有可能回到之前的状态,所以不能运用动态规划解决。

另外通过该题也可以看出,要想应用网络流首先应该将实际问题抽象出来,将具体意义的性质或量抽象成网络流模型中的流量或者容量。

补充一下,该题确实是二分图匹配,通过添加源点和汇点利用最大流实现的最大匹配问题,可看这里:点击打开链接

细节参见代码:

#include<bits/stdc++.h>
using namespace std;
const int INF = 100000000;
const int maxn = 505;
int T,cnt,n,m,t,k,a[maxn],p[maxn];
char s[maxn],buf[maxn];
map<string,int> pp;
struct Edge{
    int from,to,cap,flow;
    Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f) {}

};
vector<Edge> edges;
vector<int> g[maxn];
void init() {
    for(int i=0;i<maxn;i++) g[i].clear();
    edges.clear();
}
void addedge(int from,int to,int cap) { //增加边并将每个节点对应的边保存在g中
    edges.push_back(Edge(from,to,cap,0));
    edges.push_back(Edge(to,from,0,0));
    t = edges.size();
    g[from].push_back(t-2);
    g[to].push_back(t-1);
}
int maxflow(int s,int t) {
    int flow = 0; //最大流初始化为0
    for(;;) {  //核心算法,需要注意,我们一开始加进来的边的流量都是0,通过求最小残量逐步增广,更新最大流
        memset(a,0,sizeof(a));
        queue<int> Q;
        Q.push(s);
        a[s] = INF;
        while(!Q.empty()) {
            int x = Q.front(); Q.pop();
            for(int i=0;i<g[x].size();i++) {
                Edge& e = edges[g[x][i]];
                if(!a[e.to]&&e.cap > e.flow) {
                    p[e.to] = g[x][i];     //记录每次增加流量的路径
                    a[e.to] = min(a[x],e.cap-e.flow); //求出该道路中所有残量的最小值
                    Q.push(e.to);
                }
            }
            if(a[t]) break;  //到达终点,退出
        }
        if(!a[t]) break; //终点残量为0,不能再增广,break;
        for(int u=t;u != s; u = edges[p[u]].from) {
            edges[p[u]].flow += a[t]; //将所求残量加入到该路径中
            edges[p[u]^1].flow -= a[t]; //将反向路径减去
        }
        flow += a[t]; //更新总的最大流
    }
    return flow;
}
int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);
        init();
        pp.clear(); cnt = 1;
        for(int i=0;i<n;i++) {
            scanf("%s",s);
            if(!pp.count(s)) pp[s] = cnt++; 
            addedge(pp[s],500,1); //因为插头种类最大400,故将汇点设为500
        }
        scanf("%d",&m);
        for(int i=0;i<m;i++) {
            scanf("%s%s",buf,s);
            if(!pp.count(s)) pp[s] = cnt++;
            addedge(0,pp[s],1);    //将源点设为0
        }
        scanf("%d",&k);
        for(int i=0;i<k;i++) {
            scanf("%s%s",buf,s);
            if(!pp.count(buf)) pp[buf] = cnt++;
            if(!pp.count(s)) pp[s] = cnt++;
            addedge(pp[buf],pp[s],INF);
        }
        printf("%d\n",m - maxflow(0,500));
        if(T) printf("\n");
    }
    return 0;
}


### 回答1: 无线电力传输是一种新兴的技术,可以为轻型插电式/电动汽车提供便利。该技术的原理是使用电磁感应原理将电能从发射器传输到接收器,从而实现无需插线充电的方式。 轻型插电式/电动汽车使用无线电力传输可以带来多种优势。首先,它可以消除电动汽车充电时的插拔过程,减少用户的操作复杂性,提高用户体验。其次,无线充电可以提高充电效率,减少能量损耗,同时减少电能传输中的能量浪费。 为了实现无线电力传输,需要在道路上布置特殊的电磁感应发射器,这些发射器可以向电动汽车传输电能。对于无线充电系统,需要特定的接收器设备将电能接收并转换为汽车所需的电能。为了使无线电力传输更加高效,需要准确地对准发射器和接收器之间的位置。 为了使轻型插电式/电动汽车的无线充电系统功能正常,需要在汽车和道路上进行对齐。这可以通过使用视频监控技术和自动感应技术来实现。在汽车停在对应的充电区域时,监控系统会自动检测车辆的位置,并将发射器和接收器对准。如果发射器和接收器没有对齐,则无线电力传输将受到影响,充电效率会降低。 虽然无线电力传输为轻型插电式/电动汽车提供了便利,但目前仍面临一些挑战。其中最重要的是发射器和接收器之间的对准精度问题。此外,无线充电系统的成本也需要进一步降低,以使其在未来更广泛地应用于道路上。 总的来说,无线电力传输对于轻型插电式/电动汽车的充电提供了一种便捷的方式,并且对齐发射器和接收器是确保充电效率和充电速度的重要因素。随着技术的不断改进和成本的降低,无线电力传输将在未来成为一种主流的充电方式。 ### 回答2: 无线电能传输(wireless power transfer)是一种将电能通过空中传输的技术。对于轻型插电式/电动汽车(light-duty plug-in/electric vehicles)而言,采用无线电能传输技术可以实现无需物理连接地为车辆充电。 传统的充电方式需要通过插头与插座进行物理连接,这种方式存在着固定位置、易损坏、使用便利性差等问题。而采用无线电能传输技术,可以有效地解决这些问题,提高电动车辆的充电效率和使用便捷性。 无线电能传输技术的原理是通过电磁感应原理将电能从充电器传输到车辆电池中。充电器中的线圈产生磁场,而车辆上的线圈则感应到磁场并将其转化为电能进行充电。这种无线传输的方式减少了电能传输时的能量损耗,并能实现定位与电能传输的高效对齐。 无线电能传输技术为轻型插电式/电动汽车的充电提供了更加灵活、便捷的方式。用户只需要将车辆停放在充电器附近,无需任何物理连接,就能实现充电功能。这不仅提高了用户的使用便利性,还能进一步促进电动车辆的普及。 充电器的定位与电能传输的高效对齐对于无线电能传输技术至关重要。通过使用先进的定位技术和传感器,可以实现车辆与充电器之间的精确对齐,进而提高能量传输的效率和速度。这种高效对齐技术可以有效避免能量传输过程中的能量损耗,提高充电速度。 综上所述,无线电能传输技术为轻型插电式/电动汽车的充电带来了更高的便捷性和效率。通过定位与电能传输的高效对齐,能够进一步提高能量传输的效率和速度,促进电动车辆的发展与普及。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值