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) ...
随机推荐
- Java基础笔记14
1.反射. Class:反射类 任何一个类都有一个Class反射类.(影子) java.lang.reflect.*; Field:字段类 Method:方法类类 Constructor:构造方法类. ...
- Introduction of Git, Github and Gitlab
========================================================================== Version control is a syst ...
- C++ UI资源
最近又来搞界面了,现把这几天收集到的资料汇总下,方便今后慢慢学习! Duilib: Duilib是一个Windows下免费开源的DirectUI界面库,由于简约易扩展的设计以及稳定高效的实现被各大互联 ...
- Vue.js—快速入门
Vue.js是什么 Vue.js 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目 ...
- 玩玩Qt(一)
最近在看一些关于游戏引擎的东西,本来是有几个游戏的小点子,其实实现起来还挺麻烦的,想找个游戏引擎看看能不能码起来.辗转之后发现了很多2D引擎,其中国产的要数cocos2dx用的好像是比较广泛,但是好多 ...
- 微信支付——openid获取不到
1.写微信支付遇到状况,通过wx.login获取code,然后向微信服务器获取openid,获取失败:{"errcode":40029,"errmsg":&qu ...
- JS中encodeURI,escape,encodeURIComponent区别
js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1 ...
- javascript第七章--DOM
① 节点层次 ② DOM操作技术
- java并发之线程同步(synchronized和锁机制)
使用synchronized实现同步方法 使用非依赖属性实现同步 在同步块中使用条件(wait(),notify(),notifyAll()) 使用锁实现同步 使用读写锁实现同步数据访问 修改锁的公平 ...
- Java面试之框架篇(八)
71,谈谈你对Struts的理解. 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServle ...