codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊

时间:2023-03-09 17:03:02
codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊

一开始T了一组RE了一组,实在找不出错来,就把数组加了一个0竟然就多A了一组。很惊讶的又加了几个0最后竟然全A了!!!

懒得做了,改的是之前的那个蚯蚓的游戏问题。还是需要拆点,至于为什么不能重复走结点,很容易想吧。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct charge{
int u,v,cost,c,next;
}f[];
int n,m,k,num=,cnt=,point[],q[],pre[],dist[];
bool vis[];
void insect(int x,int y,int co,int bei)
{
f[cnt].u=x;f[cnt].v=y;f[cnt].cost=bei;f[cnt].c=co;
f[cnt].next=point[x];point[x]=cnt++;
f[cnt].u=y;f[cnt].v=x;f[cnt].cost=-bei;f[cnt].c=;
f[cnt].next=point[y];point[y]=cnt++;
}
bool spfa(int begin,int end)
{
int mp,a,b,head=,tail=;
memset(q,,sizeof(q));
memset(pre,0xff,sizeof(pre));
memset(dist,0x7f,sizeof(dist));
memset(vis,,sizeof(vis));
q[]=begin; dist[begin]=; vis[begin]=;
while (head<=tail)
{
a=q[head];
vis[a]=;
mp=point[a];
while (mp>=)
{
if (f[mp].c>){
b=f[mp].v;
if (dist[b]>dist[a]+f[mp].cost)
{
dist[b]=dist[a]+f[mp].cost;
pre[b]=mp;
if (!vis[b]){vis[b]=;tail++;q[tail]=b;}
}
}
mp=f[mp].next;
}
head++;
}
return dist[end]!=;
}
int MCMF(int begin,int end)
{
int ans=,mp,i,flow,flowsum=;
while (spfa(begin,end))
{
flow=;
for (i=pre[end];i!=-;i=pre[f[i].u])
if (f[i].c<flow) flow=f[i].c;
for (i=pre[end];i!=-;i=pre[f[i].u])
{
f[i].c-=flow;
f[i^].c+=flow;
}
ans+=dist[end];
flowsum+=flow;
}
return ans;
}
int main()
{
scanf("%d %d\n",&n,&k);
int i,a,b,c,j,ff;
memset(point,0xff,sizeof(point));
insect(,,k,);
scanf("%d",&c); num+=; insect(,,,); insect(,,,-c);
for (i=;i<=n;++i)
{
scanf("%d",&c); num+=;
insect(,num-,,); insect(num-,num-,,);
insect(num-,num,,-c);
}
ff=;
for (i=;i<=n;++i)
{
scanf("%d",&c); num+=; insect(ff,num-,,); insect(num-,num,,-c);
for (j=;j<=n;++j)
{
ff+=;
scanf("%d",&c); num+=;
insect(num-,num-,,); insect(ff,num-,,);
insect(num-,num,,-c);
}
ff=((i-)*n*)+;
}num++;
for (i=;i<=n;++i)
insect((n-)*n*++i*,num,,);
printf("%d\n",-*MCMF(,num));
return ;
}