XJOI网上同步训练DAY6 T1


思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊。
我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n个点拆成 我们枚举数字的最小公倍数 个,因为如果一个数模某个数等于0,那么模它的因数也一定是0,因此我们的思路就是拆点最短路。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
const int p[]={,,,,,,,,,,,,,,,,,,,,,,,};
int tot,go[],first[],next[];
struct edge{
int u,v;
}e[];
int a[],n,m,vis[][],dis[][],c[][];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int x,int y){
tot++;
go[tot]=y;
next[tot]=first[x];
first[x]=tot;
}
void add(int x,int y){
insert(x,y);insert(y,x);
}
int gcd(int a,int b){
if (b==) return a;
else return gcd(b,a%b);
}
void build(int Mod){
for (int i=;i<=n;i++) first[i]=;tot=;
for (int i=;i<=m;i++){
if (Mod%a[e[i].u]!=) continue;
if (Mod%a[e[i].v]!=) continue;
add(e[i].u,e[i].v);
}
}
int spfa(int Mod){
build(Mod);
for (int i=;i<=n;i++)
for (int j=;j<Mod;j++)
dis[i][j]=0x3f3f3f3f,vis[i][j]=;
int h=,t=;c[h][]=;c[h][]=a[]%Mod;
vis[][]=;dis[][a[]%Mod]=a[];
while (h<=t){
int nowx=c[h][],nowy=c[h++][];
for (int i=first[nowx];i;i=next[i]){
int pur1=go[i],pur2=((nowy*%Mod)+a[pur1])%Mod;
if (dis[pur1][pur2]>dis[nowx][nowy]+a[pur1]){
dis[pur1][pur2]=dis[nowx][nowy]+a[pur1];
if (vis[pur1][pur2]) continue;
vis[pur1][pur2]=;
t++;
c[t][]=pur1;c[t][]=pur2;
}
}
vis[nowx][nowy]=;
}
return dis[n][];
}
void solve(){
int ans=0x3f3f3f3f;
int sb=a[]*a[n]/gcd(a[],a[n]);
for (int i=;i<;i++)
if (p[i]%sb==){
ans=std::min(ans,spfa(p[i]));
}
if (ans==0x3f3f3f3f) ans=-;
printf("%d\n",ans);
}
int main(){
int T=read();
while (T--){
n=read();m=read();
for (int i=;i<=n;i++) first[i]=;tot=;
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<=m;i++){
e[i].u=read();e[i].v=read();
}
solve();
}
}
XJOI网上同步训练DAY6 T1的更多相关文章
- XJOI网上同步训练DAY6 T2
思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...
- XJOI网上同步训练DAY5 T1
思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...
- XJOI网上同步训练DAY3 T1
思路:看来我真是思博了,这么简单的题目居然没想到,而且我对复杂度的判定也有点问题.. 首先我们选了一个位置i的b,那一定只对i和以后的位置造成改变,因此我们可以这样看: 我们从前往后选,发现一个位置的 ...
- XJOI网上同步训练DAY2 T1
[问题描述] 为了迎接校庆月亮中学操场开始施工.不久后操场下发现了很多古墓这些古墓中有很多宝藏.然而学生们逐渐发现自从操场施工之后学校的运气就开始变得特别不好.后来经过调查发现古墓下有一个太守坟由于操 ...
- XJOI网上同步训练DAY1 T1
思路:我们考虑由于没有人的区间会覆盖其他人,所以我们将区间按左端点排序,发现如果地盘长度已知,可以贪心地尽量往左放,来判断是否有解,因此做法很简单,就是二分答案,然后O(n)贪心判定,复杂度为O(nl ...
- XJOI网上同步训练DAY5 T3
就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...
- XJOI网上同步测试DAY14 T1
思路:线段树维护最短路 #include<cstdio> #include<cmath> #include<iostream> #include<algori ...
- XJOI网上同步训练DAY3 T2
考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分 ...
- XJOI网上同步训练DAY2 T2
[问题描述] 火车司机出秦川跳蚤国王下江南共价大爷游长沙.每个周末勤劳的共价大爷都会开车游历长沙市. 长沙市的交通线路可以抽象成为一个
随机推荐
- Linux企业级项目实践之网络爬虫(28)——爬虫socket处理
Socket是进程之间交换数据的机制.这些进程即可以是同一台机器上的,也可以是通过网络连接起来的不同机器.一旦一个Socket连接建立,那么数据就能够双向传输,直到其中一端关闭连接. 通常,请求数据的 ...
- LibCurl编程手册以及代码实例
1. LibCurl编程流程 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcu ...
- ACM2055_ctype.h_cctype
#include<iostream> int main() { using namespace std; int y,count; char x; cin>>count; wh ...
- [LeetCode] 200. Number of Islands 解题思路
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...
- java中文乱码解决之道(六)—–javaWeb中的编码解码
在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...
- 简单Mysql思维导图
- 关于bootstrap--导航栏
1.普通导航:class .nav-tabs. <ul class="nav nav-tabs"> <li class="active"> ...
- yii 使用 phpmailer发送邮件
原文链接 : http://www.yiiframework.com/extension/mailer/ 下载插件放在 :XXX/protected/extensions/ 作为一个普通的组建使用 ...
- less.css基础学习,陆续更新中
//基础//概念:动态样式语言,有很多语言的特性:变量,函数,运算等 //变量:通过一个简单的@+字母,数字下划线等,但不能以数字开头,不能关键字,保留字等//注意less.css是全局变量,除在函数 ...
- Django之模板语言
一.模板语言介绍 模板语言渲染的整个过程其实就是将html转换成函数,并为该函数提供全局变量,然后执行该函数 二.模板语言的语法 模板中也有自己的语言,该语言可以实现数据展示 # 业务请求处理做的页面 ...