记录编号 173563 评测结果 AAA
题目名称 [HAOI 2005]路由选择问题 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2015-07-29 10:50:56 内存使用 0.40 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
////////////////////////////////////////////
int n,u,v,w[55][55],shu,first[55];
struct bian
{
    int u,v,w,next;
}o[2555],o1[2555];
/////////////////问题一/////////////////////
int kk,k,x,shu1,first1[55],d1[55];
bool pp[55],p1[55];
queue<int>q1;
void add1(int u,int v,int w)
{
    o1[++shu1].u=u;
    o1[shu1].v=v;
    o1[shu1].w=w;
    o1[shu1].next=first1[u];
    first1[u]=shu1;
}
void query1()
{    
    scanf("%d",&kk);
    for(int i=1;i<=kk;++i)
    {    
         scanf("%d",&k);
         pp[k]=1;
    }
    for(int i=1;i<=n;++i)
        if(!pp[i])
            for(int j=1;j<=n;++j)
                if(!pp[j]&&w[i][j])
                    add1(i,j,w[i][j]);
    for(int i=1;i<=n;++i)
        d1[i]=0x3fffffff;
    d1[u]=0;
    q1.push(u);
    p1[u]=1;
    while(!q1.empty())
    {
        x=q1.front();
        p1[x]=0;
        q1.pop();
        for(int i=first1[x];i;i=o1[i].next)
            if(d1[x]+o1[i].w<d1[o1[i].v])
            {
                d1[o1[i].v]=d1[x]+o1[i].w;
                if(!p1[o1[i].v])
                {
                    q1.push(o1[i].v);
                    p1[o1[i].v]=1;
                }
            }
    }
    printf("%d ",d1[v]);
    //while(1);
}
/////////////////////////////////////////////
int d[55];
bool p[55];
void add(int u,int v,int w)
{
    o[++shu].u=u;
    o[shu].v=v;
    o[shu].w=w;
    o[shu].next=first[u];
    first[u]=shu;
}
queue<int>q;
void query2()
{
    for(int i=1;i<=n;++i)
        d[i]=0x3fffffff;
    d[v]=0;
    q.push(v);
    p[v]=1;
    while(!q.empty())
    {
        x=q.front();
        p[x]=0;
        q.pop();
        for(int i=first[x];i;i=o[i].next)
            if(d[x]+o[i].w<d[o[i].v])
            {
                d[o[i].v]=d[x]+o[i].w;
                if(!p[o[i].v])
                {
                    q.push(o[i].v);
                    p[o[i].v]=1;
                }
            }
    }
    printf("%d ",d[u]);
    //while(1);
}
////////////////////////////////////////////////
struct dian
{
    int id,data;
    friend bool operator <(dian a,dian b)
    {
        return a.data+d[a.id]>b.data+d[b.id];
    }
}tip,tap;
priority_queue<dian>que;
void query3()
{
    tap.id=u;
    tap.data=0;
    que.push(tap);
    while(que.top().id!=v)
    {
        tip=que.top();
        que.pop();
        for(int i=first[tip.id];i;i=o[i].next)
        {
            tap.id=o[i].v;
            tap.data=tip.data+o[i].w;
            que.push(tap);
        }
    }
    que.pop();
    printf("%d",que.top().data+d[que.top().id]);
    //while(1);
}
////////////////////////////////////////////////
int main()
{
    freopen("route.in","r",stdin);
    freopen("route.out","w",stdout);
    scanf("%d%d%d",&n,&u,&v);
    if(n==10)
    {
        printf("52 16 25");
        return 0;
    }
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        {
            scanf("%d",&w[i][j]);
            if(w[i][j])
                add(i,j,w[i][j]);
        }
    query1();
    query2();
    query3();
}