2131: Can Win

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 431  Solved: 50

SubmitStatusWeb
Board

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

12 15 62 20 11 0

Sample Output

Yes
思路:

已经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+链式前向星(难点:抽象出网络模型+建边)的更多相关文章

  1. poj-1459-最大流dinic+链式前向星-isap+bfs+stack

    title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...

  2. 网络流dinic模板,邻接矩阵+链式前向星

    //这个是邻接矩阵的#include<iostream> #include<queue> #include<string.h> #include<stdio. ...

  3. zzuli 2130: hipercijevi 链式前向星+BFS+输入输出外挂

    2130: hipercijevi Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 595  Solved: 112 SubmitStatusWeb B ...

  4. 链式前向星+SPFA

    今天听说vector不开o2是数组时间复杂度常数的1.5倍,瞬间吓傻.然后就问好的图表达方式,然后看到了链式前向星.于是就写了一段链式前向星+SPFA的,和普通的vector+SPFA的对拍了下,速度 ...

  5. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

  6. hdu2647 逆拓扑,链式前向星。

    pid=2647">原文地址 题目分析 题意 老板发工资,可是要保证发的工资数满足每一个人的期望,比方A期望工资大于B,仅仅需比B多1元钱就可以.老板发的最低工资为888元.输出老板最 ...

  7. 图的存储结构:邻接矩阵(邻接表)&链式前向星

    [概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...

  8. 【模板】链式前向星+spfa

    洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...

  9. HDU1532 Drainage Ditches SAP+链式前向星

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

随机推荐

  1. LeetCode 202. Happy Number (快乐数字)

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  2. 开源API集成测试工具 Hitchhiker v0.3更新 - 自动同步

    Hitchhiker 是一款开源的 Restful Api 集成测试工具,支持Schedule, 数据对比,压力测试,可以轻松部署到本地,和你的team成员一起管理Api. 详细介绍请看: http: ...

  3. (转)Spark JAVA RDD API

    对API的解释: 1.1 transform l  map(func):对调用map的RDD数据集中的每个element都使用func,然后返回一个新的RDD,这个返回的数据集是分布式的数据集 l   ...

  4. C++ new 解析重载

    C++ new 解析重载 new的三种形式: (1)operator new(运算符new) (2)new operator(new 操作) (3)placement new(特殊的new操作)(不分 ...

  5. 网络基础二 tcp/ip协议簇 端口 三次握手 四次挥手 11种状态集

    第1章 概念介绍 1.1 VLAN 1.1.1 什么是VLAN VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成 ...

  6. 【翻译】.Net Core的意义

    想要了解.Net Core的意义,就必须要了解拥有很长历史的.Net Framework,.Net Framework1.0于2002年发布.从那开始,每隔两年就会有一个主版本推出.伴随着Visual ...

  7. w3wp.exe已附加有调试器,但没有该调试器配置为调试此未经处理的异常,若要调试此异常,必须分离当前的调试器。

    之前通过使用VS2010附加进程调试项目后,今天开机发现调试本机的项目报错如下图: 到网上到处查看无果,经过反复实验找到解决方法,我的项目是发布到IIS的 1.首先删除IIS上面的项目 2.在VS右击 ...

  8. 项目实战2.2—nginx 反向代理负载均衡、动静分离和缓存的实现

    实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备注 nginx VIP:172.17.11.11 反向代理服务器 开启代理功能 设置监控,调度 rs01 RIP ...

  9. Docker Swarm 中最重要的概念- 每天5分钟玩转 Docker 容器技术(94)

    从主机的层面来看,Docker Swarm 管理的是 Docker Host 集群.所以先来讨论一个重要的概念 - 集群化(Clustering). 服务器集群由一组网络上相互连接的服务器组成,它们一 ...

  10. java 之 简单工厂模式(大话设计模式)

    以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...