关于本题建边的两种写法
查看原帖
关于本题建边的两种写法
420129
Nt_Tsumiki楼主2024/2/28 15:20

向前连边

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; }

看不出来有什么区别但是实际上一个能过,一个过不去

2024/2/28 15:20
加载中...