在裸的SPFA上加了个条件..当要从一个点出发去另一个点时,同时有其他人要从这个点出发..那么当前就要等1秒然后再看能否走..
所以就每次更新dis时加上等待时间就是..对于每个plant..用set容器来记录某时间有无其他人要出发....
Program:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define oo 2000000000
#define pi acos(-1)
using namespace std;
struct node1
{
int x,y,t,next;
}line[200005];
int n,m,_link[100005],dis[100005];
queue<int> myqueue;
bool inqueue[100005];
set<int> p[100005];
int T(int x,int t)
{
while (p[x].find(t)!=p[x].end()) t++;
return t;
}
void SPFA()
{
int i,k,h,x;
memset(dis,-1,sizeof(dis));
memset(inqueue,false,sizeof(inqueue));
while (!myqueue.empty()) myqueue.pop();
myqueue.push(1);
dis[1]=0;
while (!myqueue.empty())
{
h=myqueue.front();
myqueue.pop();
inqueue[h]=false;
k=_link[h];
x=T(h,dis[h]);
while (k)
{
if (dis[line[k].y]==-1 || x+line[k].t<dis[line[k].y])
{
dis[line[k].y]=x+line[k].t;
if (!inqueue[line[k].y])
{
myqueue.push(line[k].y);
inqueue[line[k].y]=true;
}
}
k=line[k].next;
}
}
return;
}
int main()
{
int i,k,x,y;
scanf("%d%d",&n,&m);
memset(_link,0,sizeof(_link));
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&line[i*2-1].x,&line[i*2-1].y,&line[i*2-1].t);
line[i*2-1].next=_link[line[i*2-1].x];
_link[line[i*2-1].x]=i*2-1;
line[i*2].x=line[i*2-1].y; line[i*2].y=line[i*2-1].x;
line[i*2].t=line[i*2-1].t;
line[i*2].next=_link[line[i*2].x];
_link[line[i*2].x]=i*2;
}
for (i=1;i<=n;i++)
{
scanf("%d",&k);
p[i].clear();
while (k--)
{
scanf("%d",&x);
p[i].insert(x);
}
}
SPFA();
printf("%d\n",dis[n]);
return 0;
}