hdu3549Flow Problem poj1273Drainage Ditches poj3281Dining sgu185 Network flow

本文深入探讨了流式计算技术在大数据处理中的应用,包括实时数据处理、大规模数据处理策略、以及如何利用流式计算优化数据处理流程。重点介绍了Hadoop、Spark等开源框架在流式计算领域的实践案例,旨在帮助读者理解并掌握流式计算的核心概念与实际应用。

hdu3549Flow_Problem

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5005;
const int M = 30005;
struct Enode{
    int y, c, next;
} e[M * 2];
//struct Point
//{
//	int son,cur,pre,lim,d;
//} a[maxn];
int n, m, tot, head[N], now[N], h[N], vh[N], augc, found, flow;
//h为距离,vh为距离标号的数目,augc当前边的流量,flow总流量
//int tot, n, m, st, ed, cnt[maxn];
void Addedge(int x, int y, int c){
    e[++tot].y = y; e[tot].c = c; e[tot].next = head[x]; head[x] = tot;
    e[++tot].y = x; e[tot].c = 0; e[tot].next = head[y]; head[y] = tot;
}
void Init(){
    int x, y, c, i;
    scanf("%d%d", &n, &m);
    tot = -1; memset(head, -1, sizeof(head));
    for (i = 0; i < m; i++){
        scanf("%d%d%d", &x, &y, &c);
        Addedge(x, y, c);
    }
    memcpy(now, head, sizeof(head));
}

void Aug(int x, int st, int ed, int n){//x当前点,st源点,ed汇点,n,点最大数目
    int p = now[x], minh = n - 1, augco = augc;
    if (x == ed){
        found = 1;
        flow += augc;
        return;
    }
    while (p != -1){//每条边
        if (e[p].c > 0 && h[e[p].y] + 1 == h[x]){//e[p].y下一点,可行弧
            augc = min(augc, e[p].c);
            Aug(e[p].y, st, ed, n);//下一点
            if (h[st] >= n) return;
            if (found) break;
            augc = augco;
        }
        p = e[p].next;//下一边
    }
    if (found){
        e[p].c -= augc;
        e[p ^ 1].c += augc;//边标号从0开始,反向边,p^1
    }else{
        p = head[x];
        while (p != -1){
            if (e[p].c > 0 && h[e[p].y] < minh){
                minh = h[e[p].y];//最小标号
                now[x] = p;
            }
            p = e[p].next;
        }
        vh[h[x]] --;//标号数目-1
        if (!vh[h[x]]) h[st] = n;//无符合标号
        h[x] = minh + 1;//修改当前节点标号
        vh[h[x]] ++;
    }
}
void Maxflow(int st, int ed, int n){
    flow = 0;
    memset(h, 0, sizeof(h));
    memset(vh, 0, sizeof(vh));
    vh[0] = n;//距离标号的数目
    while (h[st] < n){
        found = 0;
        augc = 1 << 30;//假设流量无穷大
        Aug(st, st, ed, n);
    }
}
int main(){
    int T,cas=0;
    scanf("%d",&T);
    while(T--){
        Init();
        Maxflow(1, n, n);
        printf("Case %d: %d\n",++cas, flow);
    }
    return 0;
}
poj1273Drainage Ditches
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 2222
#define MAXM 444444 //邻接表要开边数的2倍
#define inf 1<<30

struct Edge {
    int v,cap,next;
} edge[MAXM];

int n,m,vs,vt,NE,NV;
int head[MAXN];

void Insert(int u,int v,int cap)
{
    edge[NE].v=v;
    edge[NE].cap=cap;
    edge[NE].next=head[u];
    head[u]=NE++;

    edge[NE].v=u;
    edge[NE].cap=0;
    edge[NE].next=head[v];
    head[v]=NE++;
}

int level[MAXN];//标记层次(距离标号)
int gap[MAXN];
//间隙优化,定义gap[i]为标号是i的点的个数
//在重标记i时,检查gap[level[i]],若减为0,这算法结束。

void bfs(int vt)
{
    memset(level,-1,sizeof(level));
    memset(gap,0,sizeof(gap));
    level[vt]=0;
    gap[level[vt]]++;
    queue<int>que;
    que.push(vt);
    while(!que.empty()) {
        int u=que.front();
        que.pop();
        for(int i=head[u]; i!=-1; i=edge[i].next) {
            int v=edge[i].v;
            if(level[v]!=-1)continue;
            level[v]=level[u]+1;
            gap[level[v]]++;
            que.push(v);

        }
    }
}


int pre[MAXN];//前驱
int cur[MAXN];

int SAP(int vs,int vt)//源点,汇点
{
    bfs(vt);//bfs优化,
    memset(pre,-1,sizeof(pre));
    memcpy(cur,head,sizeof(head));//cur保存的是当前弧
    int u=pre[vs]=vs,flow=0,aug=inf;//源点前驱还是它本身,aug表示增广路的可改尽量
    gap[0]=NV;
    while(level[vs]<NV) {
        bool flag=false;
        for(int &i=cur[u]; i!=-1; i=edge[i].next) {
            int v=edge[i].v;//v是u的后继
            //寻找可行弧
            if(edge[i].cap&&level[u]==level[v]+1) {
                flag=true;//找到可行弧
                pre[v]=u;//记录前驱
                u=v;
                //  aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap));
                aug=min(aug,edge[i].cap);
                //如果找到 一条增广路
                if(v==vt) {
                    flow+=aug;//更新最大流
                    for(u=pre[v]; v!=vs; v=u,u=pre[u]) {
                        edge[cur[u]].cap-=aug;//前向弧容量减少
                        edge[cur[u]^1].cap+=aug;//后向弧容量增加
                    }
                    //     aug=-1;
                    aug=inf;
                }
                break;
            }
        }
        if(flag)continue;
        int minlevel=NV;
        //寻找与当前点相连接的点中最小的距离标号(重标号)
        for(int i=head[u]; i!=-1; i=edge[i].next) {
            int v=edge[i].v;
            if(edge[i].cap&&level[v]<minlevel) {
                minlevel=level[v];
                cur[u]=i;
            }
        }
        if(--gap[level[u]]==0)break;//更新gap数组后若出现断层,直接退出
        level[u]=minlevel+1;//重标号
        gap[level[u]]++;//距离标号为level[u]的点的个数+1
        u=pre[u];//转为当前节点的前驱继续寻找可行弧
    }
    return flow;
}
int main()
{
    int u,v,w,w1,w2;
    while(scanf("%d%d",&m,&n)==2){
        vs=0;
        vt=n-1;
        NV=n;//总点数
        NE=0;
        memset(head,-1,sizeof(head));
        for(int i=1; i<=m; i++) {
            scanf("%d%d%d",&u,&v,&w);
            Insert(--u,--v,w);
        //Insert(v,u,w);
        }
        printf("%d\n",SAP(vs,vt));
    }
    return 0;
}
poj3281Dining
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5005;
const int M = 30005;
struct Enode{
    int y, c, next;
} e[M * 2];
//struct Point
//{
//	int son,cur,pre,lim,d;
//} a[maxn];
int n, m, tot, head[N], now[N], h[N], vh[N], augc, found, flow;
//h为距离,vh为距离标号的数目,augc当前边的流量,flow总流量
//int tot, n, m, st, ed, cnt[maxn];
void Addedge(int x, int y, int c){
    e[++tot].y = y; e[tot].c = c; e[tot].next = head[x]; head[x] = tot;
    e[++tot].y = x; e[tot].c = 0; e[tot].next = head[y]; head[y] = tot;
}
int f,d;
void Init(){
    int x, y, c, i,tmp;
    scanf("%d%d%d", &n, &f, &d);
    tot = -1; memset(head, -1, sizeof(head));
    for (i = 1; i <= n; i++){
        scanf("%d%d", &x, &y);
        while(x--){
            scanf("%d",&tmp);
            Addedge(0,tmp,1);
            //Addedge(tmp,f+i,1);在这里可能会加重了
        }
        Addedge(i+f,i+f+n,1);
        while(y--){
            scanf("%d",&tmp);
            Addedge(i+n+f,f+2*n+tmp,1);
            //Addedge(f+2*n+tmp,f+2*n+d+1,1);
        }
    }
    for(int j=1;j<=f;j++) Addedge(j,i+f,1);
    for(int j=1;j<=d;j++) Addedge(j+f+n*2,d+f+n*2+1,1);
    memcpy(now, head, sizeof(head));
}

void Aug(int x, int st, int ed, int n){//x当前点,st源点,ed汇点,n,点最大数目
    int p = now[x], minh = n-1, augco = augc;
    if (x == ed){
        found = 1;
        flow += augc;
        return;
    }
    while (p != -1){//每条边
        if (e[p].c > 0 && h[e[p].y] + 1 == h[x]){//e[p].y下一点,可行弧
            augc = min(augc, e[p].c);
            Aug(e[p].y, st, ed, n);//下一点
            if (h[st] >= n) return;
            if (found) break;
            augc = augco;
        }
        p = e[p].next;//下一边
    }
    if (found){
        e[p].c -= augc;
        e[p ^ 1].c += augc;//边标号从0开始,反向边,p^1
    }else{
        p = head[x];
        while (p != -1){
            if (e[p].c > 0 && h[e[p].y] < minh){
                minh = h[e[p].y];//最小标号
                now[x] = p;
            }
            p = e[p].next;
        }
        vh[h[x]] --;//标号数目-1
        if (!vh[h[x]]) h[st] = n;//无符合标号
        h[x] = minh + 1;//修改当前节点标号
        vh[h[x]] ++;
    }
}
void Maxflow(int st, int ed, int n){
    flow = 0;
    memset(h, 0, sizeof(h));
    memset(vh, 0, sizeof(vh));
    vh[0] = n;//距离标号的数目
    while (h[st] < n){
        found = 0;
        augc = 1 << 30;//假设流量无穷大
        Aug(st, st, ed, n);
    }
}
int main(){
    Init();
    Maxflow(0, 2*n+f+d+1, 2*n+f+d+2);
    printf("%d\n", flow);
}
sgu185
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 444
#define MAXM 160002 //邻接表要开边数的2倍
#define inf 1<<30
#define INF 1<<30
#define maxn 444
bool vis[maxn];
int adj[maxn][maxn],dis[maxn];//pre[]记录前驱
int n, m;
void dijkstra(int v)
{
    int i, j, u , min;
    for(i=0;i<=n;i++)  {
        dis[i]=adj[v][i];
        vis[i]=0;
    }
    vis[v]=1;dis[v]=0;
    for(i=1;i<=n;i++)   {
        min = INF;
        for(j=1;j<=n;j++)
            if(!vis[j]&&min > dis[j]){
                min = dis[j];
                u = j;
            }
        if(min == INF)break;
        vis[u]=1;
        for(j=1;j<=n;j++){
            if(!vis[j]&&adj[u][j]!=INF&&dis[u]+adj[u][j]<dis[j])
                dis[j] = adj[u][j] + dis[u];
        }
    }
}
struct Edge {
    int v,cap,next;
} edge[MAXM];

int vs,vt,NE,NV;
int head[MAXN];

void Insert(int u,int v,int cap)
{
    edge[NE].v=v;
    edge[NE].cap=cap;
    edge[NE].next=head[u];
    head[u]=NE++;

    edge[NE].v=u;//反向边
    edge[NE].cap=0;
    edge[NE].next=head[v];
    head[v]=NE++;
}
void make_graph(){
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++){
        if(i==j||adj[i][j]==INF) continue;
        if(dis[i]+adj[i][j]==dis[j]){
            Insert(i-1,j-1,1);
            //Insert(j-1,i-1,1);
            //printf("edge:%d %d\n",i,j);
        }
    }
}
int level[MAXN];//标记层次(距离标号)
int gap[MAXN];
//间隙优化,定义gap[i]为标号是i的点的个数
//在重标记i时,检查gap[level[i]],若减为0,这算法结束。

void bfs(int vt)
{
    memset(level,-1,sizeof(level));
    memset(gap,0,sizeof(gap));
    level[vt]=0;
    gap[level[vt]]++;
    queue<int>que;
    que.push(vt);
    while(!que.empty()) {
        int u=que.front();
        que.pop();
        for(int i=head[u]; i!=-1; i=edge[i].next) {
            int v=edge[i].v;
            if(level[v]!=-1)continue;
            level[v]=level[u]+1;
            gap[level[v]]++;
            que.push(v);
        }
    }
}
int pre[MAXN];//前驱
int cur[MAXN];

int SAP(int vs,int vt)//源点,汇点
{
    bfs(vt);//bfs优化,
    memset(pre,-1,sizeof(pre));
    memcpy(cur,head,sizeof(head));//cur保存的是当前弧
    int u=pre[vs]=vs,flow=0,aug=inf;//源点前驱还是它本身,aug表示增广路的可改尽量
    gap[0]=NV;
    while(level[vs]<NV) {
        bool flag=false;
        for(int &i=cur[u]; i!=-1; i=edge[i].next) {
            int v=edge[i].v;//v是u的后继
            //寻找可行弧
            if(edge[i].cap&&level[u]==level[v]+1) {
                flag=true;//找到可行弧
                pre[v]=u;//记录前驱
                u=v;
                //  aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap));
                aug=min(aug,edge[i].cap);
                //如果找到 一条增广路
                if(v==vt) {
                    flow+=aug;//更新最大流
                    for(u=pre[v]; v!=vs; v=u,u=pre[u]) {
                        edge[cur[u]].cap-=aug;//前向弧容量减少
                        edge[cur[u]^1].cap+=aug;//后向弧容量增加
                    }
                    //     aug=-1;
                    aug=inf;
                }
                break;
            }
        }
        if(flag)continue;
        int minlevel=NV;
        //寻找与当前点相连接的点中最小的距离标号(重标号)
        for(int i=head[u]; i!=-1; i=edge[i].next) {
            int v=edge[i].v;
            if(edge[i].cap&&level[v]<minlevel) {
                minlevel=level[v];
                cur[u]=i;
            }
        }
        if(--gap[level[u]]==0)break;//更新gap数组后若出现断层,直接退出
        level[u]=minlevel+1;//重标号
        gap[level[u]]++;//距离标号为level[u]的点的个数+1
        u=pre[u];//转为当前节点的前驱继续寻找可行弧
    }
    //cout<<'f'<<flow<<endl;
    return flow;
}
bool flag;//flag的作用
void dfs(int u){///////////输出路径
    if(flag) return ;
    if(u==n-1){
        flag=true;
        cout<<endl;
        return ;
    }
    for(int i=head[u];i!=-1&&!flag;i=edge[i].next){
        int v=edge[i].v;
        if(edge[i].cap==0 && !(i&1)){///////
            edge[i].cap=-1;
            cout<<' '<<v+1;
            dfs(v);
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++)for(int j=0;j<=n;j++){
        if(i==j)adj[i][j]=0;
        else adj[i][j]=INF;
    }
    for(int i=1;i<=m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        adj[x][y]=adj[y][x]=z;
    }
    dijkstra(1);
    //cout<<' '<<dis[n]<<endl;
    vs=0;
    vt=n-1;
    NV=n;//总点数
    NE=0;
    memset(head,-1,sizeof(head));
    make_graph();//位置= =
    if(SAP(vs,vt)<2)printf("No solution\n");
    else{
        cout<<1;
        flag=false;
        dfs(0);
        //cout<<'a'<<endl;
        cout<<1;
        flag=false;
        dfs(0);
    }
    return 0;
}


基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
【四旋翼无人机】具备螺旋桨倾斜机构的全驱动四旋翼无人机:建模与控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动四旋翼无人机展开研究,重点进行了系统建模与控制策略的设计与仿真验证。通过引入螺旋桨倾斜机构,该无人机能够实现全向力矢量控制,从而具备更强的姿态调节能力和六自由度全驱动特性,克服传统四旋翼欠驱动限制。研究内容涵盖动力学建模、控制系统设计(如PID、MPC等)、Matlab/Simulink环境下的仿真验证,并可能涉及轨迹跟踪、抗干扰能力及稳定性分析,旨在提升无人机在复杂环境下的机动性与控制精度。; 适合人群:具备一定控制理论基础和Matlab/Simulink仿真能力的研究生、科研人员及从事无人机系统开发的工程师,尤其适合研究先进无人机控制算法的技术人员。; 使用场景及目标:①深入理解全驱动四旋翼无人机的动力学建模方法;②掌握基于Matlab/Simulink的无人机控制系统设计与仿真流程;③复现硕士论文级别的研究成果,为科研项目或学术论文提供技术支持与参考。; 阅读建议:建议结合提供的Matlab代码与Simulink模型进行实践操作,重点关注建模推导过程与控制器参数调优,同时可扩展研究不同控制算法的性能对比,以深化对全驱动系统控制机制的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值