2589. 完成所有任务的最少时间
思路:参考大佬的思路:差分约束
class Solution {
public:
typedef struct Node{
int e,d;
}node;
int findMinimumTime(vector<vector<int>>& tasks) {
vector<node> v[2010];
//先把数组中的约束加进去(第tasks[i][1]个点的值-第tasks[i][0]-1个点的值>=tasks[i][2])
for(int i=0;i<tasks.size();i++){
v[tasks[i][1]].push_back({tasks[i][0]-1,tasks[i][2]*-1});
}
//把相邻点之间的约束加进去(第i+1个点的值-第i个点的值<=1)
for(int i=0;i<=2000;i++){
v[i].push_back({i+1,1});
}
//把相邻点之间的约束加进去(第i+1个点的值-第i个点的值>=0)
for(int i=1;i<=2000;i++){
v[i].push_back({i-1,0});
}
//加一个出发点S=2000+1,从这个点开始出发
for(int i=0;i<=2000;i++){
v[2001].push_back({i,0});
}
//下面就是SPFA算法了
int dis[2010];
memset(dis,0x3f,sizeof dis);
bool sta[2010];
memset(sta,0,sizeof sta);
queue<int> qu;
qu.push(2001);
sta[2001]=1;
dis[2001]=0;
while(qu.size()){
int t=qu.front();
qu.pop();
sta[t]=0;
for(int i=0;i<v[t].size();i++){
int tmp=v[t][i].e;
int d=v[t][i].d;
if(dis[tmp]>dis[t]+d){
dis[tmp]=dis[t]+d;
if(!sta[tmp]){
qu.push(tmp);
sta[tmp]=1;
}
}
}
}
return dis[2000]-dis[0];
}
};