传送门
思路:如果加工到一个组件的其中一个零件时所花的时间加上本身加工所需的时间是大于加工完其所需零件的时间,那么此工序关系就不成立
详细解释都在注释中
#include <iostream>
#include <vector>
using namespace std;
struct machine
{
int start;/*到加工至这个零件所用的时间*/
int time;/*生产出零件本身所花的时间*/
vector<int>need;/*生产这个零件所需要的零件*/
};
int main()
{
int t;//机器台数
cin >> t;
while(t--)
{
vector<machine>s(905);/*每个组件的信息*/
int n;
cin >> n;//第一台机器所需要加工的组件的数目
while(n--)
{
int id,p;/*组件id和所需零件数*/
int start = 0;/*每个组件同时开始,生产至第一个零件所花的时间都是0*/
int m ;/*一个组件所需的零件数目*/
cin >> m;
while(m--)
{
machine temp;
temp.start = start;/*生产至零件前所需的时间*/
cin >> id/*零件的id*/ >> temp.time/*生产这个零件本身所需时间*/ >> p/*生产此零件加工所需的零件*/;
while(p--)
{
int idx;
cin >> idx;
temp.need.push_back(idx);/*把零件加工所需的每个零件的id都push到need中*/
}
start += temp.time;/*下一个零件加工前所需的时间即为前几个零件加工所花时间的和*/
s[id] = temp;
}
}
bool flag = true;
for(int i = 1; i < s.size(); i++)
{
for(int j = 0 ; j < s[i].need.size(); j++)
{
int index = s[i].need[j];/*每个组件的每个零件所需的零件*/
if(s[i].start < s[index].start + s[index].time)/*如果加工这个组件的这个零件前所花的时间小于所需零件加工出来的时间总和则不存在此工序*/
{
flag = false;
}
}
}
if(flag)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}