codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊
一开始T了一组RE了一组,实在找不出错来,就把数组加了一个0竟然就多A了一组。很惊讶的又加了几个0最后竟然全A了!!!
懒得做了,改的是之前的那个蚯蚓的游戏问题。还是需要拆点,至于为什么不能重复走结点,很容易想吧。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 struct charge{ 7 int u,v,cost,c,next; 8 }f[500003]; 9 int n,m,k,num=2,cnt=0,point[500003],q[500003],pre[500003],dist[500003]; 10 bool vis[500003]; 11 void insect(int x,int y,int co,int bei) 12 { 13 f[cnt].u=x;f[cnt].v=y;f[cnt].cost=bei;f[cnt].c=co; 14 f[cnt].next=point[x];point[x]=cnt++; 15 f[cnt].u=y;f[cnt].v=x;f[cnt].cost=-bei;f[cnt].c=0; 16 f[cnt].next=point[y];point[y]=cnt++; 17 } 18 bool spfa(int begin,int end) 19 { 20 int mp,a,b,head=0,tail=0; 21 memset(q,0,sizeof(q)); 22 memset(pre,0xff,sizeof(pre)); 23 memset(dist,0x7f,sizeof(dist)); 24 memset(vis,0,sizeof(vis)); 25 q[0]=begin; dist[begin]=0; vis[begin]=1; 26 while (head<=tail) 27 { 28 a=q[head]; 29 vis[a]=0; 30 mp=point[a]; 31 while (mp>=0) 32 { 33 if (f[mp].c>0){ 34 b=f[mp].v; 35 if (dist[b]>dist[a]+f[mp].cost) 36 { 37 dist[b]=dist[a]+f[mp].cost; 38 pre[b]=mp; 39 if (!vis[b]){vis[b]=1;tail++;q[tail]=b;} 40 } 41 } 42 mp=f[mp].next; 43 } 44 head++; 45 } 46 return dist[end]!=2139062143; 47 } 48 int MCMF(int begin,int end) 49 { 50 int ans=0,mp,i,flow,flowsum=0; 51 while (spfa(begin,end)) 52 { 53 flow=2139062143; 54 for (i=pre[end];i!=-1;i=pre[f[i].u]) 55 if (f[i].c<flow) flow=f[i].c; 56 for (i=pre[end];i!=-1;i=pre[f[i].u]) 57 { 58 f[i].c-=flow; 59 f[i^1].c+=flow; 60 } 61 ans+=dist[end]; 62 flowsum+=flow; 63 } 64 return ans; 65 } 66 int main() 67 { 68 scanf("%d %d\n",&n,&k); 69 int i,a,b,c,j,ff; 70 memset(point,0xff,sizeof(point)); 71 insect(1,2,k,0); 72 scanf("%d",&c); num+=2; insect(2,3,1,0); insect(3,4,1,-c); 73 for (i=2;i<=n;++i) 74 { 75 scanf("%d",&c); num+=2; 76 insect(2,num-1,1,0); insect(num-2,num-1,1,0); 77 insect(num-1,num,1,-c); 78 } 79 ff=4; 80 for (i=2;i<=n;++i) 81 { 82 scanf("%d",&c); num+=2; insect(ff,num-1,1,0); insect(num-1,num,1,-c); 83 for (j=2;j<=n;++j) 84 { 85 ff+=2; 86 scanf("%d",&c); num+=2; 87 insect(num-2,num-1,1,0); insect(ff,num-1,1,0); 88 insect(num-1,num,1,-c); 89 } 90 ff=((i-1)*n*2)+4; 91 }num++; 92 for (i=1;i<=n;++i) 93 insect((n-1)*n*2+2+i*2,num,1,0); 94 printf("%d\n",-1*MCMF(1,num)); 95 return 0; 96 }
NOI 2017 Bless All
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步