记录编号 443741 评测结果 AWAAA
题目名称 [HAOI 2005]希望小学 最终得分 80
用户昵称 Gravatar_WA自动机 是否通过 未通过
代码语言 C++ 运行时间 0.002 s
提交时间 2017-08-31 23:27:23 内存使用 0.31 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<climits>
using namespace std;
int n,b1,b2,b3,g1,g2,g3,k,x[31],y[31],dis[31][31],num,head[101];
bool vis[31];
struct Edge
{
    int dis,to,next;
}edge[101];

void add(int from,int to,int dis)
{
    edge[++num].next=head[from];
    edge[num].dis=dis;
    edge[num].to=to;
    head[from]=num;
}

void spfa(int v)
{
    queue<int> q;
    q.push(v);
    vis[v]=1;dis[v][v]=0;
    while(!q.empty())
    {
        int now=q.front();q.pop();vis[now]=0;
        for (int i=head[now];i;i=edge[i].next)
        {
            if (dis[v][now]+edge[i].dis<dis[v][edge[i].to])
            {
                dis[v][edge[i].to]=dis[v][now]+edge[i].dis;
                if (!vis[edge[i].to])
                {
                    q.push(edge[i].to);
                    vis[edge[i].to]=1;
                }
            }
        }
    }
}

int main()
{
    #ifndef COGS
    freopen("hopeschool.in","r",stdin);
    freopen("hopeschool.out","w",stdout);
    #endif // COGS
    memset(dis,0x3f,sizeof(dis));
    scanf("%d%d%d%d%d%d%d",&n,&b1,&b2,&b3,&g1,&g2,&g3);
    for (int i=1;i<=n;++i)
    {
        scanf("%d",x+i);
    }
    for (int i=1;i<=n;++i)
    {
        scanf("%d",y+i);
    }
    scanf("%d",&k);
    for (int i=1;i<=k;++i)
    {
        int ai,bi,si1,si2,si3;
        scanf("%d%d%d%d%d",&ai,&bi,&si1,&si2,&si3);
        int least1=INT_MAX,least2=INT_MAX;
        least1=si1*(x[ai]*b1+y[ai]*g1)+si2*(x[ai]*b2+y[ai]*g2)+si3*(x[ai]*b3+y[ai]*g3);
        add(ai,bi,least1);
        least2=si1*(x[bi]*b1+y[bi]*g1)+si2*(x[bi]*b2+y[bi]*g2)+si3*(x[bi]*b3+y[bi]*g3);
        add(bi,ai,least2);
    }
    for (int i=1;i<=n;++i)
    spfa(i);
    int MIN=INT_MAX,pos;
    for (int i=1;i<=n;++i)
    {
        int ans=0;
        for (int j=1;j<=n;++j)
        {
            if (dis[j][i]!=0x3f3f3f3f)
            ans+=dis[j][i];
        }
        if (ans<MIN) {MIN=ans;pos=i;}
    }
    printf("%d\n",pos);
    return 0;
}
/********************我怎么还没有凑够100行******************************
/********************我怎么还没有凑够100行******************************
/********************我怎么还没有凑够100行******************************
/********************我怎么还没有凑够100行******************************
/********************我怎么还没有凑够100行******************************
/********************我怎么还没有凑够100行******************************
/********************我怎么还没有凑够100行******************************
/********************我怎么还没有凑够100行******************************
/********************我怎么还没有凑够100行******************************
/********************我怎么还没有凑够100行******************************
/**************************好了,够了***********************************/