关键还是试图揣测题意的锅
题意不难就是有点繁琐(:з」∠)而且还必须用c
能分配就分配 不能分配就不管
分配了发现找不到安全序列就unsafe
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int work[1010],avil[1010];
struct Node
{
int need[1000],alloc[1010],mx[1010];
int id;
int pd;
} a[1010];
int mark[1010],now[1010],req[1010],last[1010];
int flag,now_deep;
int n,m;
int cmp(const void*p1,const void*p2)
{
return(*(struct Node*)p2).need[0]<(*(struct Node*)p1).need[0]?1:-1;
}
void sor()
{
int i;
qsort(a,n,sizeof(a[0]),cmp);
for (i=0; i<n; i++)
{
mark[a[i].id]=i;
// printf("%d# %d\n",a[i].id,a[i].need[0]);
}
}
void cs()
{
int i,j;
for (i=0; i<n; i++)
{
for (j=1; j<=m; j++) printf("%d ",a[i].mx[j]);
for (j=1; j<=m; j++) printf("%d ",a[i].alloc[j]);
for (j=1; j<=m; j++) printf("%d ",a[i].need[j]);
printf("pd=%d",a[i].pd);
printf(" id=%d",a[i].id);
printf("\n");
}
for (j=1; j<=m; j++ ) printf("%d ",avil[j]);
printf("\n");
for (j=1; j<=m; j++ ) printf("%d ",work[j]);
printf("\n");
}
void dfs(int deep)
{
int i,j;
int mid;
if (deep==n)
{
flag=1;
for (i=now_deep; i<n; i++) last[i]=a[now[i]].id;
return;
}
if (flag) return;
for (i=0; i<n; i++)
if (a[i].pd==0)
{
mid=1;
for (j=1; j<=m; j++)
if (a[i].need[j]>work[j])
{
mid=0;
break;
}
if (mid)
{
for (j=1; j<=m; j++) work[j]+=a[i].alloc[j];
a[i].pd=1;
now[deep]=i;
// cs();
dfs(deep+1);
a[i].pd=0;
// now[deep]=-1;
for (j=1; j<=m; j++) work[j]-=a[i].alloc[j];
}
}
}
int check_safe()
{
int j,i,_id;
sor();
for (i=0; i<n; i++) a[i].pd=0;
for (j=1; j<=m; j++) work[j]=avil[j];
/* for (i=0; i<now_deep; i++)
{
_id=mark[last[i]];
a[_id].pd=1;
for (j=1; j<=m; j++) work[j]=work[j]+a[_id].alloc[j]+a[_id];
}*/
// printf("%d",a[mark[last[0]]].id);
// cs();
flag=0;
dfs(now_deep);
return flag;
}
void __init()
{
int i,j;
scanf("%d%d",&m,&n);//资源数 进程数
for (i=0; i<n; i++) a[i].id=i;
for (i=0; i<n; i++)
for (j=1; j<=m; j++) scanf("%d",&a[i].mx[j]);
for (i=0; i<n; i++)
{
a[i].need[0]=0;
for (j=1; j<=m; j++)
{
scanf("%d",&a[i].alloc[j]);
a[i].need[j]=a[i].mx[j]-a[i].alloc[j];
a[i].need[0]+=a[i].need[j];
}
}
sor();
}
int main()
{
int fg;
int i,j,t,pi;
__init();
for (i=0; i<n; i++) a[i].pd=0;
for (j=1; j<=m; j++) scanf("%d",&avil[j]);
now_deep=0;
if (check_safe())
{
while (~scanf("%d",&pi))
{
pi=mark[pi]; //printf("**%d\n",pi);
for (j=1; j<=m; j++) scanf("%d",&req[j]);
if (flag)
{
fg=1;
for (j=1; j<=m; j++)
if (req[j]>a[pi].need[j] || req[j]>avil[j])
{
fg=0;
if (req[j]>a[pi].need[j]) flag=0;
break;
}
if (fg)
{
for (j=1; j<=m; j++)
{
avil[j]-=req[j];
a[pi].alloc[j]+=req[j];
a[pi].need[j]-=req[j];
a[pi].need[0]-=req[j];
}
// last[now_deep++]=a[pi].id;
if (!check_safe())
{
for (j=1; j<=m; j++)
{
avil[j]+=req[j];
a[pi].alloc[j]-=req[j];
a[pi].need[j]+=req[j];
a[pi].need[0]+=req[j];
}
// now_deep--;
}
}
}
}
}
// printf("%d\n",mark[last[0]]);
//cs();
if (check_safe())
{
printf("safe order:");
t=0;
for (i=0; i<n; i++)
{
if (t>0) printf(" ");
t++;
printf("P");
if (last[i]<=9) printf("0");
printf("%d",last[i]);
}
printf("\n");
}
else printf("unsafe\n");
return 0;
}