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 152. Maximum Product Subarray (最大乘积子数组)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  2. 将一个实体转换成 Url 参数的形式 ?a=a&b=b

    function toQueryString(obj) { var ret = []; for (var key in obj) { key = encodeURIComponent(key); va ...

  3. IIS下自定义错误页面配置的两种方式(亲测可行)--IIS服务器

    网站自定义错误页面的设置,大家应该都知道它的重要性……不多说,下面带大家一步步在IIS下设置网站自定义错误页面…… 1.首先进入你的网站主页,找到[错误页](注意是IIS下的错误页不是.NET错误页) ...

  4. 0_Simple__cudaOpenMP

    在OpenMP的多线程程序中,各线程分别调用CUDA进行计算.OpenMP的简单示例. ▶ 源代码: #include <omp.h> #include <stdio.h> # ...

  5. 「设计模式」JavaScript - 设计模式之单例模式与场景实践

    单例介绍 上次总结了设计模式中的module模式,可能没有真真正正的使用在场景中,发现效果并不好,想要使用起来却不那么得心应手, 所以这次我打算换一种方式~~从简单的场景中来看单例模式, 因为Java ...

  6. JSTL中foreach与fn表达式

    在jstl中的fn标签也是我们在网页设计中经常要用到的很关键的标签,在使用的时候要先加上头 <%@ taglib uri=" http://java.sun.com/jsp/jstl/ ...

  7. Velocity(6)——velocity遍历josn格式的字符串

    使用velocity脚本语言遍历josn格式的字符串 1.由于数据库会存储一些json格式的字符,为方便以后使用筛选 如果这些数据我们查出来直接遍历使用velocity是根本行不通的,例如这样的话:j ...

  8. firefox被hao123绑架的解决办法

    1.在地址栏里输入"about:support" 2.单击配置文件夹后的"打开文件夹"按钮. 3.在弹出来的文件夹中找到那个叫做"user.js&qu ...

  9. Java实现归并排序和快速排序

    参考http://blog.csdn.net/morewindows/article/details/6684558和http://developer.51cto.com/art/201206/344 ...

  10. 使用MS Test做单元测试

    声明:本篇博客翻译自:http://www.c-sharpcorner.com/article/unit-testing-with-ms-tests-in-c-sharp/ 写在翻译之前: 依然清晰的 ...