向前连边
if (mp1[a[i]]) add(p[mp1[a[i]]][2],p[i][2],INF,0),add(p[i][2],p[mp1[a[i]]][2],0,0);
if (mp2[a[i]%7]) {
add(p[mp2[a[i]%7]][1],p[i][3],INF,0),add(p[i][3],p[mp2[a[i]%7]][1],0,0);
add(p[mp2[a[i]%7]][3],p[i][3],INF,0),add(p[i][3],p[mp2[a[i]%7]][3],0,0);
}
if (mp1[a[i]-1]) add(p[mp1[a[i]-1]][1],p[i][2],INF,0),add(p[i][2],p[mp1[a[i]-1]][1],0,0);
if (mp1[a[i]+1]) add(p[mp1[a[i]+1]][1],p[i][2],INF,0),add(p[i][2],p[mp1[a[i]+1]][1],0,0);
mp1[a[i]]=i,mp2[a[i]%7]=i;
向后连边
for (int j=i+1;j<=n;j++)
if (a[i]==a[j]) {
add(p[i][2],p[j][2],INF,0),add(p[j][2],p[i][2],0,0);
break;
}
for (int j=i+1;j<=n;j++)
if (a[i]%7==a[j]%7) {
add(p[i][1],p[j][3],INF,0),add(p[j][3],p[i][1],0,0);
add(p[i][3],p[j][3],INF,0),add(p[j][3],p[i][3],0,0);
break;
}
for (int j=i+1;j<=n;j++)
if (a[i]-a[j]==1) { add(p[i][1],p[j][2],INF,0),add(p[j][2],p[i][1],0,0); break; }
for (int j=i+1;j<=n;j++)
if (a[j]-a[i]==1) { add(p[i][1],p[j][2],INF,0),add(p[j][2],p[i][1],0,0); break; }
看不出来有什么区别但是实际上一个能过,一个过不去