记录编号 474089 评测结果 AAAAAAAAAA
题目名称 交换 最终得分 100
用户昵称 Gravatarユッキー 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2017-11-09 17:00:29 内存使用 0.56 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cmath>
#define inf 999999999
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
struct ss
{
    int u,v,w,next;
    ss(){next=0;}
}E[10500];//边
int dis[150][150];
int head[150];
bool vis[150];
int lv[150];
int ca;//等级
int mon[110];
int n,m;
int cnt=0;
queue<int>Q;
void add(int x,int y,int z)
{
    cnt++;
    E[cnt].u=x;
    E[cnt].v=y;
    E[cnt].w=z;
    E[cnt].next=head[x];
    head[x]=cnt;
}
bool pd(int x,int maxx,int minx)
{
    if(abs(lv[E[x].v]-ca)<=m && abs(lv[E[x].v]-maxx)<=m && abs(lv[E[x].v]-minx)<=m)return true;
    return false;
}
void SPFA(int s)
{
    memset(vis,0,sizeof(vis));
    ca=lv[s];
    int maxx=ca;//交换中的max
    int minx=ca;//交换中的min
    dis[s][s]=mon[s];
    vis[s]=1;
    Q.push(s);
    int i,tmp;
    while(!Q.empty())
    {
        tmp=Q.front();
        Q.pop();
        for(i=head[tmp];i;i=E[i].next)
        {
            if(dis[s][E[i].v]>dis[s][tmp]+E[i].w && pd(i,maxx,minx))
            {
                dis[s][E[i].v]=dis[s][tmp]+E[i].w;
                maxx=max(lv[E[i].v],maxx);
                minx=min(lv[E[i].v],minx);
                if(!vis[E[i].v])
                {
                    Q.push(E[i].v);
                    vis[E[i].v]=1;
                }
            }
        }
    }
}
int main()
{
    int i,j;
    freopen("swap.in","r",stdin);
    freopen("swap.out","w",stdout);
    scanf("%d%d",&m,&n);
    for(i=0;i<=n;i++)for(j=0;j<=n;j++)dis[i][j]=inf;
    for(i=1;i<=n;i++)
    {
        int u,x;
        scanf("%d%d%d",&mon[i],&lv[i],&x);
        for(j=1;j<=x;j++)
        {
            int v,w;
            scanf("%d%d",&v,&w);
            add(v,i,w);
        }
    }

    for(i=1;i<=n;i++)
        SPFA(i);

    int minn=mon[1];
    for(i=2;i<=n;i++)
        minn=min(minn,dis[i][1]);
    printf("%d",minn);
    return 0;
}