码迷,mamicode.com
首页 > 其他好文 > 详细

【最短路】CDOJ1633 去年春恨却来时,落花人独立,微雨燕双飞

时间:2017-05-26 21:59:53      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:pop   freopen   ima   [1]   sizeof   最小   class   names   blog   

技术分享

对于S集合中的数,例如a1,考虑到如果x能够被表示出来,那么x+a1也一定能被表示出来

设d[r]为所有模a1余r的数中,能被表示出来的最小的数

用d[x]+ai去更新d[(x+ai)%a1],跑最短路即可

 

不用真的建出图来,因为图是完全的。否则会MLE。

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
queue<int>q;
int n,a[2010],m,dis[50010];
bool inq[50010];
void spfa(int s)
{
    memset(dis+1,0x7f,sizeof(dis));
    q.push(s); inq[s]=1; dis[s]=0;
    while(!q.empty())
      {
        int U=q.front();
        for(int i=2;i<=n;++i)
          if(dis[(U+a[i])%a[1]]>dis[U]+a[i])
            {
              dis[(U+a[i])%a[1]]=dis[U]+a[i];
              if(!inq[(U+a[i])%a[1]])
                {
                  q.push((U+a[i])%a[1]);
                  inq[(U+a[i])%a[1]]=1;
                }
            }
        q.pop(); inq[U]=0;
      }
}
int main(){
//	freopen("b.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
	}
	spfa(0);
	int x;
	scanf("%d",&m);
	for(int i=1;i<=m;++i){
		scanf("%d",&x);
		puts(dis[x%a[1]]<=x ? "YES" : "NO");
	}
	return 0;
}

【最短路】CDOJ1633 去年春恨却来时,落花人独立,微雨燕双飞

标签:pop   freopen   ima   [1]   sizeof   最小   class   names   blog   

原文地址:http://www.cnblogs.com/autsky-jadek/p/6910313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!