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,&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
",-1*MCMF(1,num));
95     return 0;
96 }
NOI 2017 Bless All
原文地址:https://www.cnblogs.com/abclzr/p/5027409.html