#include #include#include#include#include#include#include#include
#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define MOD 10009
#define INF 100000000
#define ll __int64
#define bug cout<
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespacestd;structEdge
{intto,next,cost;
}edge[100000];intn,m;int head[300],tol;void addedge(int u,int v,intcost)
{
edge[tol].to=v;
edge[tol].cost=cost;
edge[tol].next=head[u];
head[u]=tol++;
}int x[110][3],y[110][3],sum[110],ans[110][110];int pre[300],vis[300],num[300],dis[300];//pre记录负环,num入队列的次数,spfa返回最先入队>n的点
int len[110][110];int spfa(int s,intn)
{
queueq;
MEM(vis,0);
MEM(num,0);for(int i=0;i
dis[i]=INF;
q.push(s);
vis[s]=1;
num[s]++;
dis[s]=0;while(!q.empty())
{int u=q.front();
q.pop();
vis[u]=0;for(int i=head[u];i!=-1;i=edge[i].next)
{int v=edge[i].to;if(dis[u]+edge[i].cost
{
dis[v]=dis[u]+edge[i].cost;
pre[v]=u;if(!vis[v])
{
vis[v]=1;
q.push(v);if(++num[v]>n) returnv;
}
}
}
}return -1;
}intmain()
{//fread;//int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{for(int i=0;i
scanf("%d%d%d",&x[i][0],&x[i][1],&x[i][2]);for(int i=0;i
scanf("%d%d%d",&y[i][0],&y[i][1],&y[i][2]);
MEM(head,-1);
tol=0;int s=n+m;//汇点
for(int i=0;i
{for(int j=0;j
{
len[i][j]=abs(x[i][0]-y[j][0])+abs(x[i][1]-y[j][1])+1;
addedge(i,j+n,len[i][j]);
}
}
MEM(sum,0);for(int i=0;i
{for(int j=0;j
{
scanf("%d",&ans[i][j]);if(ans[i][j]!=0) addedge(j+n,i,-len[i][j]);
sum[j]+=ans[i][j];
}
}for(int i=0;i
{if(sum[i]0) addedge(s,i+n,0);
}int id=spfa(s,s+1);if(id==-1) puts("OPTIMAL");else{
puts("SUBOPTIMAL");int st=id;
MEM(vis,0);while(1)
{if(!vis[st])
{
vis[st]=1;
st=pre[st];
}else{
id=st;break;
}
}do{int u=pre[st],v=st;if(u=n&&v=n&&u
st=pre[st];
}while(st!=id);for(int i=0;i
{
printf("%d",ans[i][0]);for(int j=1;j
printf("%d",ans[i][j]);
puts("");
}
}
}return 0;
}