hdu - 1083 - Courses

本文针对HDU-1083 Courses问题,采用网络流算法进行解答。通过构建特定图模型,实现从超级源到超级汇的最大流计算,以此验证是否能为每门课程分配一名学生代表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

hdu - 1083 - Courses

分类: 网络流   87人阅读  评论(0)  收藏  举报

题意:有P门课程,N个学生,每门课程有一些学生选读,每个学生选读一些课程,问能否选出P个学生组成一个委员会,使得每个学生代言一门课程(他必需选读其代言的课程),每门课程都被一个学生代言(1 <= P <= 100,1 <= N <= 300) 。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1083

——>>第一次自己想出的网络流。。。虽然是水题,但也开心死死。。。微笑

建图:设超级源S,S到每门课程连一条边,容量为1;每门课程向其选读的学生各连一条边,容量为1;每个学生向超级汇连一条边,容量为1。

这样,只要求一次最大流,判断其是否为满流P就好。。。

[cpp]  view plain copy
  1. #include <cstdio>  
  2. #include <queue>  
  3. #include <algorithm>  
  4. #include <cstring>  
  5.   
  6. using namespace std;  
  7.   
  8. const int maxn = 400 + 10;  
  9. const int maxm = 60800 + 10;  
  10. const int INF = 0x3f3f3f3f;  
  11.   
  12. int head[maxn], nxt[maxm], ecnt, v[maxm], flow[maxm], cap[maxm];  
  13. bool flag[maxn];  
  14.   
  15. struct Dinic{  
  16.     int m, s, t;  
  17.     int d[maxn], cur[maxn];  
  18.     bool vis[maxn];  
  19.   
  20.     Dinic(){  
  21.         memset(head, -1, sizeof(head));  
  22.         ecnt = 0;  
  23.     }  
  24.   
  25.     void addEdge(int uu, int vv, int ca){  
  26.         v[ecnt] = vv; cap[ecnt] = ca; flow[ecnt] = 0; nxt[ecnt] = head[uu]; head[uu] = ecnt; ecnt++;  
  27.         v[ecnt] = uu; cap[ecnt] = 0; flow[ecnt] = 0; nxt[ecnt] = head[vv]; head[vv] = ecnt; ecnt++;  
  28.     }  
  29.   
  30.     bool bfs(){  
  31.         d[s] = 0;  
  32.         memset(vis, 0, sizeof(vis));  
  33.         queue<int> qu;  
  34.         qu.push(s);  
  35.         vis[s] = 1;  
  36.         while(!qu.empty()){  
  37.             int u = qu.front(); qu.pop();  
  38.             for(int e = head[u]; e != -1; e = nxt[e]){  
  39.                 if(!vis[v[e]] && cap[e] > flow[e]){  
  40.                     d[v[e]] = d[u] + 1;  
  41.                     vis[v[e]] = 1;  
  42.                     qu.push(v[e]);  
  43.                 }  
  44.             }  
  45.         }  
  46.         return vis[t];  
  47.     }  
  48.   
  49.     int dfs(int u, int a){  
  50.         if(u == t || a == 0) return a;  
  51.         int f, Flow = 0;  
  52.         for(int e = cur[u]; e != -1; e = nxt[e]){  
  53.             cur[u] = e;  
  54.             if(d[v[e]] == d[u] + 1 && (f = dfs(v[e], min(a, cap[e]-flow[e]))) > 0){  
  55.                 flow[e] += f;  
  56.                 flow[e^1] -= f;  
  57.                 Flow += f;  
  58.                 a -= f;  
  59.                 if(!a) break;  
  60.             }  
  61.         }  
  62.         return Flow;  
  63.     }  
  64.   
  65.     int Maxflow(int s, int t){  
  66.         this->s = s;  
  67.         this->t = t;  
  68.         int Flow = 0;  
  69.         while(bfs()){  
  70.             memcpy(cur, head, sizeof(head));  
  71.             Flow += dfs(s, INF);  
  72.         }  
  73.         return Flow;  
  74.     }  
  75.   
  76. };  
  77.   
  78. int main()  
  79. {  
  80.     int T, P, N, S, cnt;  
  81.     scanf("%d", &T);  
  82.     while(T--){  
  83.         Dinic din;  
  84.         scanf("%d%d", &P, &N);  
  85.         for(int i = 1; i <= P; i++){  
  86.             din.addEdge(0, i, 1);  
  87.             scanf("%d", &cnt);  
  88.             for(int j = 1; j <= cnt; j++){  
  89.                 scanf("%d", &S);  
  90.                 din.addEdge(i, P+S, 1);  
  91.             }  
  92.         }  
  93.         for(int i = 1; i <= N; i++) din.addEdge(P+i, P+N+1, 1);  
  94.         if(din.Maxflow(0, P+N+1) == P) puts("YES");  
  95.         else puts("NO");  
  96.     }  
  97.     return 0;  
  98. }  

二分匹配也应该可以做
内容概要:本文档详细介绍了基于MATLAB实现多目标差分进化(MODE)算法进行无人机三维路径规划的项目实例。项目旨在提升无人机在复杂三维环境中路径规划的精度、实时性、多目标协调处理能力、障碍物避让能力和路径平滑性。通过引入多目标差分进化算法,项目解决了传统路径规划算法在动态环境和多目标优化中的不足,实现了路径长度、飞行安全距离、能耗等多个目标的协调优化。文档涵盖了环境建模、路径编码、多目标优化策略、障碍物检测与避让、路径平滑处理等关键技术模块,并提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,对无人机路径规划和多目标优化算法感兴趣的科研人员、工程师和研究生。 使用场景及目标:①适用于无人机在军事侦察、环境监测、灾害救援、物流运输、城市管理等领域的三维路径规划;②通过多目标差分进化算法,优化路径长度、飞行安全距离、能耗等多目标,提升无人机任务执行效率和安全性;③解决动态环境变化、实时路径调整和复杂障碍物避让等问题。 其他说明:项目采用模块化设计,便于集成不同的优化目标和动态环境因素,支持后续算法升级与功能扩展。通过系统实现和仿真实验验证,项目不仅提升了理论研究的实用价值,还为无人机智能自主飞行提供了技术基础。文档提供了详细的代码示例,有助于读者深入理解和实践该项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值