3305 作物杂交
用另外一个数组存杂交结果,初始结点都为0,遍历所有杂交结果,只要可以减小就加入到队列中。
if条件是距离小于两个max,因为必须要保证其父辈已经产生。
另外注意使用普通队列即可;
和dijkstra中的st数组不同,这里只用来判断是否是在q中。
所以所有的初始结点都要st为1,pop的时候将结点st置为0.
#include<bits/stdc++.h>
using namespace std;
//3305作物杂交
const int N=2010, M=2e5+10;
int e[M],ne[M],h[N],target[M],dis[N],timee[N],idx,st[N];
int n,m,k,t;
queue<int>q;
void add(int x,int y,int c)
{
e[idx]=y;
ne[idx]=h[x];
target[idx]=c;
h[x]=idx++;
}
void spfa()
{
while(q.size())
{
int t=q.front();
q.pop();
st[t]=0;
for(int i=h[t];i!=-1;i=ne[i])
{
int u=target[i];
if(dis[u]>max(dis[t],dis[e[i]])+max(timee[t],timee[e[i]]))
{
dis[u]=max(dis[t],dis[e[i]])+max(timee[t],timee[e[i]]);
if(st[u])continue;
else
{
q.push(u);
st[u]=1;
}
}
}
}
}
int main()
{
cin>>n>>m>>k>>t;
memset(h,-1,sizeof(h));
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++)//种植时间
{
cin>>timee[i];
}
for(int i=0;i<m;i++)//初始节点
{
int x;
cin>>x;
dis[