dij

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=20020;

typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> >q;

int head[maxn],nex[maxn],ver[maxn],wei[maxn],tot;
int k[maxn],a[520][520];
int n,m;
bool vis[maxn];
int dis[maxn];

void dij()
{
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;q.push(make_pair(0,1));
    while(q.size())
    {
        int x=q.top().second,d=q.top().first;\
        q.pop();
        //printf("%d \n",x);
        if(x==n) return;
        dis[x]
        if(d<=500&&a[x][d])
        {
            while(a[x][d])
            {
                dis[x]++;
                d++;
            }
            //printf("!\n");
            q.push(make_pair(dis[x],x));continue;
        }
        for(int i=head[x];i;i=nex[i])
        {
            int y=ver[i];
            if(dis[y]>d+wei[i])
            {
                dis[y]=d+wei[i];
                q.push(make_pair(dis[y],y));
            }
        }
        
    }
}
void add(int x,int y,int w)
{
    ver[++tot]=y;
    wei[tot]=w;
    nex[tot]=head[x];
    head[x]=tot;
}
int main()
{
        freopen("travel.in","r",stdin);
    freopen("travel.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);add(b,a,c);
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&k[i]);
        for(int j=1;j<=k[i];j++)
        {
            int x;scanf("%d",&x);
            a[i][x]=1;
        }
    }
//    for(int i=1;i<=n;i++)
//    printf("%d ",a[1][i]);
    dij();
    printf("%d",dis[n]);
    return 0;
    
}
View Code

 

posted @ 2020-11-01 21:30  ILH  阅读(122)  评论(0)    收藏  举报