(网络流24题大多需要spj,所以需要一个有spj的oj,本系列代码均在www.oj.swust.edu.cn测试通过)
又是一道混进来的奇奇怪怪的东西,想起来以前做过这道题,用的是bfs,所以就不想写了,附上之前的代码。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<algorithm>
#include<ctime>
#include<cmath>
using namespace std;
int men[16][16][4];
int xx[4]={1,-1,0,0};
int yy[4]={0,0,-1,1};
int er[11]={1,2,4,8,16,32,64,128,256,512,1024};
bool pd[1024][16][16];
int ys[16][16][11];
int topp[16][16];
int t[1000000];
struct my_dui
{
int x,y,zt;
}dui[1000000];
int main()
{
memset(men,-1,sizeof(men));
int n,m,p;
scanf("%d%d%d",&n,&m,&p);
int k;
scanf("%d",&k);
int xx1,xx2,yy1,yy2;
int zl;
for(int i=1;i<=k;i++)
{
scanf("%d%d%d%d%d",&xx1,&yy1,&xx2,&yy2,&zl);
if(abs(xx1-xx2)==1)
{
int mid,midd;
mid=min(xx1,xx2);
midd=max(xx1,xx2);
men[mid][yy1][0]=zl;
men[midd][yy1][1]=zl;
}
else if(abs(yy1-yy2)==1)
{
int mid,midd;
mid=min(yy1,yy2);
midd=max(yy1,yy2);
men[xx1][mid][3]=zl;
men[xx1][midd][2]=zl;
}
}
int s;
scanf("%d",&s);
for(int i=1;i<=s;i++)
{
int xxx,yyy;
scanf("%d%d",&xxx,&yyy);
scanf("%d",&ys[xxx][yyy][++topp[xxx][yyy]]);
}
int top=1;
int my_final=2;
dui[1].x=1;
dui[1].y=1;
dui[1].zt=0;
if(topp[1][1]!=0)
{
for(int i=1;i<=topp[1][1];i++)
{
if(!((dui[1].zt)&(ys[1][1][i]))) dui[1].zt+=er[ys[1][1][i]-1];
dui[1].zt+=er[ys[1][1][i]-1];
}
}
pd[dui[1].zt][1][1]=true;
while(top<my_final)
{
int x=dui[top].x;
int y=dui[top].y;
if(x==n && y==m)
{
cout<<t[top];
return 0;
}
int zt=dui[top].zt;
//cout<<x<<" "<<y<<" "<<zt<<endl;
for(int i=0;i<=3;i++)
{
if(men[x][y][i]==0) continue;
if(x+xx[i]>n || x+xx[i]<1 || y+yy[i]>m || y+yy[i]<1) continue;
if(men[x][y][i]!=-1)
if(!(zt&(er[men[x][y][i]-1]))) continue;
int zt1=zt;
for(int j=1;j<=topp[x+xx[i]][y+yy[i]];j++)
{
if(ys[x+xx[i]][y+yy[i]][j]!=0 && !(zt1&(er[ys[x+xx[i]][y+yy[i]][j]-1]))) zt1+=er[ys[x+xx[i]][y+yy[i]][j]-1];
}
if(pd[zt1][x+xx[i]][y+yy[i]]) continue;
pd[zt1][x+xx[i]][y+yy[i]]=true;
dui[my_final].x=x+xx[i];
dui[my_final].y=y+yy[i];
dui[my_final].zt=zt1;
t[my_final++]=t[top]+1;
}
top++;
}
cout<<-1;
return 0;
}