zoukankan      html  css  js  c++  java
  • bzoj2015 [Usaco2010 Feb]Chocolate Giving

    Description

    Farmer John有B头奶牛(1<=B<=25000),有N(2*B<=N<=50000)个农场,编号1-N,有M(N-1<=M<=100000)条双向边,第i条边连接农场R_i和S_i(1<=R_i<=N;1<=S_i<=N),该边的长度是L_i(1<=L_i<=2000)。居住在农场P_i的奶牛A(1<=P_i<=N),它想送一份新年礼物给居住在农场Q_i(1<=Q_i<=N)的奶牛B,但是奶牛A必须先到FJ(居住在编号1的农场)那里取礼物,然后再送给奶牛B。你的任务是:奶牛A至少需要走多远的路程?

     

     

    Input

      第1行:三个整数:N,M,B。

        第2..M+1行:每行三个整数:R_i,S_i和L_i,描述一条边的信息。

      第M+2..M+B+1行:共B行,每行两个整数P_i和Q_i,表示住在P_i农场的奶牛送礼物给住在Q_i农场的奶牛。

      

    Output

     

      样例输出:

      共B行,每行一个整数,表示住在P_i农场的奶牛送礼给住在Q_i农场的奶牛至少需要走的路程

     

    Sample Input

    6 7 3

      1 2 3

      5 4 3

      3 1 1

      6 1 9

      3 4 2

      1 4 4

      3 2 2

      2 4

      5 1

      3 6


    Sample Output

     6

     6

    10

    囧o(╯□╰)o

    裸的spfa就过了,加了slf就wa……

    求大神指导为什么

    这样是可以A的

    #include<cstdio>
    #define inf 100000000
    struct edge{
    	int to,next,v;
    }e[200010];
    int dist[50010];
    bool mrk[50010];
    int q[1000010];
    int head[50010];
    int n,m,b,cnt,t,w;
    inline void ins(int u,int v,int w)
    {
    	e[++cnt].to=v;
    	e[cnt].v=w;
    	e[cnt].next=head[u];
    	head[u]=cnt;
    }
    inline void insert(int u,int v,int w)
    {
    	ins(u,v,w);
    	ins(v,u,w);
    }
    inline void spfa(int S)
    {  
        for (int i=2;i<=n;i++)dist[i]=inf;
        q[1]=S;mrk[S]=1;
        t=0;w=1;
        while (t<w)
        {  
            int now=q[++t];
            for (int i=head[now];i;i=e[i].next)  
              if (dist[e[i].to]>dist[now]+e[i].v)  
              {  
                dist[e[i].to]=dist[now]+e[i].v;  
                if (!mrk[e[i].to])  
                {  
                    mrk[e[i].to]=1;
                    q[++w]=e[i].to;
                }  
              }  
            mrk[now]=0;
        }
    }
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int main()
    {
    	n=read();m=read();b=read();
    	int x,y,z;
    	for(int i=1;i<=m;i++)
    	{
    		x=read();y=read();z=read();
    		insert(x,y,z);
    	}
    	spfa(1);
    	for (int i=1;i<=b;i++)
    	{
    		x=read();y=read();
    		printf("%d
    ",dist[x]+dist[y]);
    	}
    	return 0;
    }
    

      

    加了slf就wa了

    #include<cstdio>
    #define inf 100000000
    #define mod 50010
    struct edge{
        int to,next,v;
    }e[200010];
    int dist[50010];
    bool mrk[50010];
    int q[50010];
    int head[50010];
    int n,m,b,cnt,t,w;
    inline void ins(int u,int v,int w)
    {
        e[++cnt].to=v;
        e[cnt].v=w;
        e[cnt].next=head[u];
        head[u]=cnt;
    }
    inline void insert(int u,int v,int w)
    {
        ins(u,v,w);
        ins(v,u,w);
    }
    inline void spfa(int S)  
    {  
        for (int i=1;i<=n;i++)mrk[i]=0;
        for (int i=1;i<=n;i++)dist[i]=inf;
        q[0]=S;mrk[S]=1;dist[S]=0;
        t=0;w=0;
        do
        {  
            int now=q[t];
            t=(t+1)%mod;
            for (int i=head[now];i;i=e[i].next)  
              if (dist[e[i].to]>dist[now]+e[i].v)  
              {  
                dist[e[i].to]=dist[now]+e[i].v;  
                if (!mrk[e[i].to])  
                {  
                    mrk[e[i].to]=1;  
                    if (dist[q[t]]>dist[e[i].to])
                    {
                        t=(t-1+mod)%mod;
                        q[t]=e[i].to;
                    }
                    else
                    {
                        w=(w+1)%mod;
                        q[w]=e[i].to;
                    }
                }  
              }  
            mrk[now]=0;  
        }
        while (t!=w);
    }  
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int main()
    {
        n=read();m=read();b=read();
        int x,y,z;
        for(int i=1;i<=m;i++)
        {
            x=read();y=read();z=read();
            insert(x,y,z);
        }
        spfa(1);
        for (int i=1;i<=b;i++)
        {
            x=read();y=read();
            printf("%d
    ",dist[x]+dist[y]);
        }
        return 0;
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    mysql root密码重置
    fetch跨域问题
    HTML5触摸事件(touchstart、touchmove和touchend)
    react-router-dom
    清理网站缓存
    从零开始学java (标识符,关键字,基本数据类型)
    从零开始学java ( 初始java)
    入职一年心得
    guava 函数式编程三兄弟
    java读取各种类型文件
  • 原文地址:https://www.cnblogs.com/zhber/p/4035932.html
Copyright © 2011-2022 走看看