HDU 4411 Arrest

news/2024/11/25 18:56:49/

分析:很明显的费用流,最重要的还是建图,首先确立源点和汇点,因为城市0为初始点,所以我定义s为源点,然后t为汇点,s-->0建边,流量为k,费用为0,因为不一定所有K都要用到,所以需要在0-->t建边,流量为K,费用为0,接下来就是拆点了。

1)、0-->i 建边,流量为1,费用为0-->i的最短路。

2)、i-->n+i 建边,流量为1,费用-inf ,这样可以保证所有城市都能遍历到。

3)、n+i-->j建边,流量为1,费用为i-->j的最短路。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
const int maxn = 105;
const int maxm = 4050;
const int INF = 105000;
const int inf = 0x3f3f3f3f;
struct Node{int v,next,cap,cost;
}e[maxm * 10];
int Map[maxn][maxn];
int n,m,k,head[maxn<<1],dis[maxn<<1],mark[maxn<<1],path[maxn<<1],node[maxn<<1],num;
void add(int a,int b,int c,int d){e[num].v=b;e[num].cap=c;e[num].cost=d;e[num].next=head[a];head[a]=num++;e[num].v=a;e[num].cap=0;e[num].cost=-d;e[num].next=head[b];head[b]=num++;
}
int Mincost(int s,int t){int ans=0;queue<int>q;while(1){memset(dis,inf,sizeof(dis));memset(path,-1,sizeof(path));memset(node,-1,sizeof(node));q.push(s);mark[s]=1;dis[s]=0;while(!q.empty()){int u=q.front();q.pop();mark[u]=0;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].v;int cost=e[i].cost;if(dis[v]>dis[u]+cost && e[i].cap>0){dis[v]=dis[u]+cost;if(!mark[v]){mark[v]=1;q.push(v);}path[v]=u;node[v]=i;}}}// printf("%d---",dis[t]);if(dis[t]>=inf) break;int flow=inf;int now=t;while(path[now]!=-1){int ff;ff=node[now];flow=min(flow,e[ff].cap);now=path[now];}ans+=dis[t]*flow;now=t;while(path[now]!=-1){e[node[now]].cap-=flow;e[node[now]^1].cap+=flow;now=path[now];}// printf("%d\n",flow);}return ans;
}
void floyd(){for(int k=0;k<=n;k++){for(int i=0;i<=n;i++){for(int j=0;j<=n;j++){Map[i][j]=min(Map[i][k]+Map[k][j],Map[i][j]);}}}
}
int main(){while(~scanf("%d %d %d",&n,&m,&k) && (n+m+k)){for(int i=0;i<=n;i++){for(int j=0;j<=n;j++){Map[i][j]=inf;}}for(int i=0;i<m;i++){int a,b,c;scanf("%d %d %d",&a,&b,&c);Map[a][b]=Map[b][a]=min(Map[a][b],c);}floyd();int ss=0;int s=2*n+1;int t=2*n+2;int ans=INF;num=0;memset(head,-1,sizeof(head));add(s,ss,k,0);add(ss,t,k,0);for(int i=1;i<=n;i++){if(Map[0][i]<inf){add(ss,i,1,Map[0][i]);add(i+n,t,1,Map[i][0]);}add(i,i+n,1,-INF);for(int j=i+1;j<=n;j++){if(Map[i][j]<inf)add(i+n,j,1,Map[i][j]);}}ans=Mincost(s,t)+n*INF;printf("%d\n",ans);}
}



http://www.ppmy.cn/news/370600.html

相关文章

惠普电脑为什么打不开计算机刷题,如果无法打开HP笔记本计算机的无线开关该怎么办?惠普ProBook 4411s...

clp615808 通过 尊敬的HP用户&#xff0c;您好&#xff01;感谢您选择惠普产品. 根据您的描述&#xff0c;建议您参考以下信息: 1. 建议进入操作系统的桌面. 您可以右键单击[计算机](或[我的计算机])图标&#xff0c;选择[管理]&#xff0c;然后在页面左侧的[设备管理器]中-右键…

题解 P4411 【[BJWC2010]取数游戏】

看到大家都是用 f i f_i fi​ 来存储枚举到 i i i 的答案&#xff0c;这里再来一种别样的方法。 同样得先枚举 a i a_i ai​ 的约数&#xff0c;我们其实不需要存储 a i a_i ai​ , 边读边算即可。 我们用 m a i ma_i mai​ 存储约数为 i i i 的最大答案数量&#xff0…

HDU 4411 Arrest(费用流)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4411 题意&#xff1a;有N 1个城市&#xff0c;M条无向带权边&#xff0c;警局在0号点&#xff0c;其他N个点都有犯罪团伙需要抓&#xff0c;最多可以派出K支队伍去抓捕&#xff0c;到了某个城市可以选择抓或…

TPA4411RTJR

描述 TPA4411和TPA4411M是立体声耳机驱动器&#xff0c;旨在消除输出隔直电容&#xff0c;从而减少元件数量和成本。 TPA4411和TPA4411M是小型便携式电子产品的理想选择&#xff0c;其尺寸和成本是关键的设计参数。 TPA4411和TPA4411M能够在4.5 V时驱动80 mW至16负载.TPA4411和…

HDU 4411

费用流 建图见下面代码&#xff0c; 解释下这条加边addedge(2*v1,2*v2,k,0); 费用流第一遍跑肯定是跑含有v条负无穷的边。 如果以后跑反向边是对第一次跑n条负无穷的边的优化&#xff0c;如果没有优化就干脆不出动警力 #include<cstdio> #include<cstring>…

BZOJ4411 - [Usaco2016 Feb]Load balancing

Portal Description 给出平面上的\(n(n\leq10^5)\)个整点。画两条直线\(xx_0\)和\(yy_0\)将这些点划分成\(s_1,s_2,s_3,s_4\)个点&#xff0c;最小化\(max\{s_1,s_2,s_3,s_4\}\)。 Solution 二分答案线段树。 首先进行离散化&#xff0c;记录\(sumY[i]\)表示\(y\leq i\)的点的个…

构建基因共表达网络鉴定CD8 T细胞浸润相关生物标志物在肾透明细胞癌中的作用

构建基因共表达网络鉴定CD8 T细胞浸润相关生物标志物在肾透明细胞癌中的作用 文章目录 构建基因共表达网络鉴定CD8 T细胞浸润相关生物标志物在肾透明细胞癌中的作用文献信息背景和目的实验流程方法和结果从GSE73731下载CCRCC的数据&#xff0c;并进行预处理使用CIBERSORT评估每…

湖南大学CS-2019期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 一. 填空题(10 分,每空 2 分) 1. 0xb1e56f07 存放在采用小端存储的机器上,地址为 0x3287 到 0x328a ,则 0x3288 处存…