zzuli 2131 Can Win dinic+链式前向星(难点:抽象出网络模型+建边)
2131: Can Win
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 431 Solved: 50
Description
Zhc很喜欢看某个竞技比赛,比赛的规则是这样的:队伍分成AB两组进行比赛,除了组内比赛,两组之间还会进行一定的比赛,每场比赛赢者得1分,输者不得分,没有平局的情况。 在A组里面Zhc有一支自己非常喜欢的队伍,现在比赛已经进行到一半了,Zhc想知道,他支持的那支队伍有没有可能获得最终的胜利(A组最高分即为胜利,允许多支队伍同时最高分)
Input
第一行输入样例组数T<=110
每组样例第一行输入A组队伍数量n<=400,以及Zhc支持的队伍编号(1-n)K<=n
第二行按编号输入A组各队伍目前的成绩Mark[i]<= 300000
第三行按编号输入A组各队伍剩余比赛总场数Cnt[i]<= 300000
下面有一个N*N的矩阵,其中A[i][j]代表编号i的队伍跟编号j的队伍剩余比赛场数A[i][j]<=100
Output
对每组样例输出”Yes”或者”No”(不用输出引号)代表Zhc支持的队伍能获得最终的胜利,换行处理
Sample Input
Sample Output
思路:
已经AC的正确代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=+*+;
const int MAXM=**+*+;
const int INF=0x3f3f3f3f;
struct Edge
{
int v,f,next;
}edge[MAXM];
int cnt;
int first[MAXN],level[MAXN];
int q[MAXN];
void init()
{
cnt=;
memset(first,-,sizeof(first));
}
void addedge(int u, int v, int f)
{
edge[cnt].v=v,edge[cnt].f=f;
edge[cnt].next=first[u],first[u]=cnt++;
edge[cnt].v=u,edge[cnt].f=;
edge[cnt].next=first[v],first[v]=cnt++;
}
int bfs(int s, int t)
{
memset(level,,sizeof(level));
level[s]=;
int front=,rear=;
q[front]=s;
while(front<rear)
{
int x=q[front++];
if(x==t) return ;
for(int e=first[x];e!=-;e=edge[e].next)
{
int v=edge[e].v,f=edge[e].f;
if(!level[v]&&f)
{
level[v]=level[x]+;
q[rear++]=v;
}
}
}
return ;
}
int dfs(int u, int maxf, int t)
{
if(u==t) return maxf;
int ret=;
for(int e=first[u];e!=-;e=edge[e].next)
{
int v=edge[e].v,f=edge[e].f;
if(level[u]+==level[v]&&f)
{
int Min=min(maxf-ret,f);
f=dfs(v,Min,t);
edge[e].f-=f;
edge[e^].f+=f;
ret+=f;
if(ret==maxf) return ret;
}
}
return ret;
}
int Dinic(int s, int t)
{
int ans=;
while(bfs(s,t)) ans+=dfs(s,INF,t);
return ans;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n,k;scanf("%d%d",&n,&k);
int mark[];
for(int i=;i<=n;++i) scanf("%d",&mark[i]);
int cnt,highscore;
for(int i=;i<=n;++i) {
scanf("%d",&cnt);
if(i==k) {
highscore=mark[k]+cnt;
}
}
int s=,t=n*n+n+;
init();
int score,sum=;
for(int i=;i<=n;++i) {
for(int j=;j<=n;++j) {
scanf("%d",&score);
if(score==||i==k||j==k) continue;
addedge(s,i*n+j,score);
addedge(i*n+j,i,score);
addedge(i*n+j,j,score);
sum+=score;
}
}
bool flag=true;
for(int i=;i<=n;++i) {
if(i==k) continue;
if(mark[i]>highscore) {
flag=false;break;
}
addedge(i,t,highscore-mark[i]);
}
if(flag==false) {
printf("No\n");continue;
}
int result=Dinic(s,t);
if(result==sum) printf("Yes\n");
else printf("No\n");
}
return ;
}
之前的错误代码:(不清楚哪里错了,如果看出来请指教)sap+链式前向星
#include<bits/stdc++.h>
using namespace std;
const int maxn=+*+;
const int maxm=**+*+;
const int INF=0x3f3f3f3f;
struct node {
int c,to,next;
}edges[maxm];
int head[maxn];
int numh[maxn],h[maxn],curedges[maxn],pre[maxn];
int cnt;
void init() {
cnt=;
memset(head,-,sizeof(head));
}
void addedge(int u, int v, int c) {
edges[cnt].to=v;edges[cnt].c=c;edges[cnt].next=head[u];head[u]=cnt++;
edges[cnt].to=u;edges[cnt].c=;edges[cnt].next=head[v];head[v]=cnt++;
}
int sap(int source, int sink, int N) {
int cur_flow,flow_ans=,u,tmp,neck,i;
memset(h,,sizeof(h));
memset(numh,,sizeof(numh));
memset(pre,-,sizeof(pre));
for(int i=;i<=N;++i) curedges[i]=head[i];
numh[]=N;
u=source;
while(h[source]<N) {
if(u==sink) {
cur_flow=INF;
for(i=source;i!=sink;i=edges[curedges[i]].to) {
if(cur_flow>edges[curedges[i]].c) {
neck=i;
cur_flow=edges[curedges[i]].c;
}
}
for(i=source;i!=sink;i=edges[curedges[i]].to) {
tmp=curedges[i];
edges[tmp].c-=cur_flow;
edges[tmp^].c+=cur_flow;
}
flow_ans+=cur_flow;
u=neck;
}
for(i=curedges[u];i!=-;i=edges[i].next) {
if(edges[i].c&&h[u]==h[edges[i].to]+)
break;
}
if(i!=-) {
curedges[u]=i;
pre[edges[i].to]=u;
u=edges[i].to;
} else {
if(==--numh[h[u]]) break;
curedges[u]=head[u];
for(tmp=N,i=head[u];i!=-;i=edges[i].next) {
if(edges[i].c) {
tmp=min(tmp,edges[i].to);
}
}
h[u]=tmp+;
++numh[h[u]];
if(u!=source) u=pre[u];
}
}
return flow_ans;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n,k;scanf("%d%d",&n,&k);
int mark[];
for(int i=;i<=n;++i) scanf("%d",&mark[i]);
int cnt,highscore;
for(int i=;i<=n;++i) {
scanf("%d",&cnt);
if(i==k) {
highscore=mark[k]+cnt;
}
}
int s=,t=n*n+n+;
init();
int score,sum=;
for(int i=;i<=n;++i) {
for(int j=;j<=n;++j) {
scanf("%d",&score);
if(score==||i==k||j==k) continue;
addedge(s,i*n+j,score);
addedge(i*n+j,i,score);
addedge(i*n+j,j,score);
sum+=score;
}
}
bool flag=true;
for(int i=;i<=n;++i) {
if(i==k) continue;
if(mark[i]>highscore) {
flag=false;break;
}
addedge(i,t,highscore-mark[i]);
}
if(flag==false) {
printf("No\n");continue;
}
int result=sap(s,t,t+);
if(result==sum) printf("Yes\n");
else printf("No\n");
}
return ;
}
zzuli 2131 Can Win dinic+链式前向星(难点:抽象出网络模型+建边)的更多相关文章
- poj-1459-最大流dinic+链式前向星-isap+bfs+stack
title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...
- 网络流dinic模板,邻接矩阵+链式前向星
//这个是邻接矩阵的#include<iostream> #include<queue> #include<string.h> #include<stdio. ...
- zzuli 2130: hipercijevi 链式前向星+BFS+输入输出外挂
2130: hipercijevi Time Limit: 1 Sec Memory Limit: 128 MB Submit: 595 Solved: 112 SubmitStatusWeb B ...
- 链式前向星+SPFA
今天听说vector不开o2是数组时间复杂度常数的1.5倍,瞬间吓傻.然后就问好的图表达方式,然后看到了链式前向星.于是就写了一段链式前向星+SPFA的,和普通的vector+SPFA的对拍了下,速度 ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- hdu2647 逆拓扑,链式前向星。
pid=2647">原文地址 题目分析 题意 老板发工资,可是要保证发的工资数满足每一个人的期望,比方A期望工资大于B,仅仅需比B多1元钱就可以.老板发的最低工资为888元.输出老板最 ...
- 图的存储结构:邻接矩阵(邻接表)&链式前向星
[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...
- 【模板】链式前向星+spfa
洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...
- HDU1532 Drainage Ditches SAP+链式前向星
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- CoreCLR源码探索(八) JIT的工作原理(详解篇)
在上一篇我们对CoreCLR中的JIT有了一个基础的了解, 这一篇我们将更详细分析JIT的实现. JIT的实现代码主要在https://github.com/dotnet/coreclr/tree/m ...
- 【20171027早】alert(1) to win 第9,10,11,12题
人在江湖,不服就干! 第9题: function escape(s) { function htmlEscape(s) { return s.replace(/./g, function(x) { r ...
- js excel 列表导出
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- hbase-1.2.5完全分布式部署
详细配置参考http://abloz.com/hbase/book.html#distributed ,2.2.2.2小节 1.修改hbase-site.xml文件.添加如下配置 cluster为ha ...
- RabbitMQ-客户端
Install-Package RabbitMQ.Client 参考: http://www.rabbitmq.com/download.html https://www.nuget.org/pack ...
- shell 组合新的变量名
shell 组合新的变量名 普通变量 name=yushuang var=name # 要获取到yushuang res=`eval echo '$'"$var"` echo $r ...
- Ocelot API网关的实现剖析
在微软Tech Summit 2017 大会上和大家分享了一门课程<.NET Core 在腾讯财付通的企业级应用开发实践>,其中重点是基于ASP.NET Core打造可扩展的高性能企业级A ...
- IdentityServer4实现Token认证登录以及权限控制
相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的:小菜学习编程-IdentityServer4 晓晨Master:Ide ...
- eclipse禁用svg文件Validation
1.打开window>preferences>validation找到xml validator 2.点击xml validator最右侧的按钮打开xml校验规则窗口,选中exclude ...
- 机器学习数学|偏度与峰度及其python实现
机器学习中的数学 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原创文章,如需转载请保留出处 本博客为七月在线邹博老师机器学习数学课程学习笔记 矩 对于随机变量X,X的K阶原点矩为 \[E( ...