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) ...
随机推荐
- DUBBO初探-搭建DUBBO开发环境
我所理解的DUBBO 相对于传统web开发框架,dubbo更加适合于并行系统开发,分布式,模块化.将server和client都注册到zookeeper注册中心上,然后由最外层客户端发起请求到相应cl ...
- H5新特性汇总
H5新特性: 新增选择器 document.querySelector.document.querySelectorAll 拖拽释放(Drag and drop) API 媒体播放的 video 和 ...
- 初探 ELK - 每天5分钟玩转 Docker 容器技术(89)
在开源的日志管理方案中,最出名的莫过于 ELK 了.ELK 是三个软件的合称:Elasticsearch.Logstash.Kibana. Elasticsearch一个近乎实时查询的全文搜索引擎.E ...
- 关于mysql的临时表并行的问题
mysql的临时表并行是没问题的 以为临时表是基于会话的 1.因为在mysql里面每个会话的sessionid 不一样 2.其实就是会话级别的临时表 DB2里面有会话级别 全局级别的临时表,Orac ...
- IdentityServer4 SigningCredential(RSA 证书加密)
IdentityServer4 默认提供了两种证书加密配置: services.AddIdentityServer() .AddDeveloperSigningCredential() .AddTem ...
- AngularJS学习篇(二)
AngularJS 指令 AngularJS 通过被称为 指令 的新属性来扩展 HTML. AngularJS 通过内置的指令来为应用添加功能. AngularJS 允许你自定义指令. Angular ...
- DOM Exception error
INDEX_SIZE_ERR code 1 索引是负值,或者超过了索引值 DOMSTRING_SIZE_ERR code 2 ...
- javaScript中的return,break,continue的区别
导语: javaScript中有三种方法可以跳出循环或者终止循环.分别为break.return.continue. 正文: 一.break break 会使得整个程序终止执行或者包含了最内层的循环或 ...
- cocos2d导入iOS原生项目
最近公司最新发下任务让融合一个cocos2dx写的游戏项目融合进现有项目,当看到要求时内心瞬间无数羊驼奔腾.------ 虽说内心是拒绝的,但是任务已经派发就必须要完成啊.所以在网上搜了大量的融入教程 ...
- C#基本功之委托和事件
定义:委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用. 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联 目的:方法声明和方法实现的分离,使得程序更容易扩展 一 ...