QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#784939 | #7177. Many Many Cycles | hotdogseller | WA | 0ms | 3828kb | C++14 | 3.1kb | 2024-11-26 16:23:42 | 2024-11-26 16:23:48 |
Judging History
answer
#include<bits/stdc++.h>
#define maxn 5005
#define INF 1e18
#define pii pair<int,int>
#define int long long
using namespace std;
inline int read(){
int lre=0,f=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-'){
f=-1;
}
c=getchar();
}
while(isdigit(c)){
lre=(lre<<3)+(lre<<1)+(c-'0');
c=getchar();
}
return lre*f;
}
struct edge{
int to;
int val;
int next;
}e[2*maxn];
int e_cnt=1,head[maxn];
void add(int u,int v,int w){
e[e_cnt].to=v;
e[e_cnt].val=w;
e[e_cnt].next=head[u];
head[u]=e_cnt++;
}
int gcd(int a,int b){
return (b==0)?a:gcd(b,a%b);
}
int n,m,res=0;
vector<pair<pii,int> > E;
int root[maxn];
int f_f(int x){
if(root[x]!=x){
root[x]=f_f(root[x]);
}
return root[x];
}
int dfs_cnt=1;
int f[maxn];
int mapping[maxn],q_map[maxn],depth[maxn],cnt[maxn];
int sz[maxn],son[maxn],rt[maxn];
void dfs1(int x,int fa){
sz[x]=1;cnt[x]=cnt[fa]+1;
f[x]=fa;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to,w=e[i].val;
if(v==f[x])continue;
depth[v]=depth[x]+w;
dfs1(v,x);
sz[x]+=sz[v];
if(sz[v]>sz[son[x]])son[x]=v;
}
// cout<<"depth["<<x<<"]="<<depth[x]<<endl;
}
void dfs2(int x,int RT){
rt[x]=RT;mapping[dfs_cnt]=x;
q_map[x]=dfs_cnt++;
if(son[x])dfs2(son[x],RT);
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(v==son[x]||v==f[x])continue;
dfs2(v,v);
}
}
int lca(int u,int v){
while(rt[u]!=rt[v]){
if(cnt[rt[u]]<cnt[rt[v]])swap(u,v);
u=f[rt[u]];
}
if(cnt[u]>cnt[v])return v;
return u;
}
int dist(int u,int v){
return depth[u]+depth[v]-2*depth[lca(u,v)];
}
bool on(int u,int v,int x){
return lca(lca(u,v),x)==lca(u,v)&&(lca(x,u)==x||lca(x,v)==x);
}//x是不是在u,v上
signed main(){
// freopen("1.in","r",stdin);
n=read();m=read();
for(int i=1;i<=n;i++)root[i]=i;
for(int i=1;i<=m;i++){
int a=read(),b=read(),c=read();
if(f_f(a)!=f_f(b)){
root[f_f(a)]=f_f(b);
add(a,b,c);add(b,a,c);
}else{
// cout<<"push!"<<endl;
E.push_back(make_pair(make_pair(a,b),c));
}
}
for(int i=1;i<=n;i++){
if(!q_map[i]){
dfs1(i,0);dfs2(i,i);
}
}
for(pair<pair<int,int>,int> p:E){
res=gcd(res,dist(p.first.first,p.first.second)+p.second);
}
// cout<<"E.size()="<<E.size()<<endl;
// cout<<"res="<<res<<endl;
for(int i=0;i<E.size();++i){
for(int j=i+1;j<E.size();++j){
int a=E[i].first.first,b=E[i].first.second,c=E[j].first.first,d=E[j].first.second;
int l1=dist(a,b)+E[i].second,l2=dist(c,d)+E[j].second;
int f1=lca(a,b),f2=lca(c,d);
int e,w;
if(on(a,b,f2)){
e=f2;
if(lca(e,a)==a){
w=dist(a,e);
}else{
w=dist(b,e);
}
}else if(on(c,d,f1)){
e=f1;
if(lca(e,c)==c){
w=dist(c,e);
}else{
w=dist(d,e);
}
}
// cout<<"l1="<<l1<<" l2="<<l2<<" w="<<w<<endl;
res=gcd(res,l1-w);res=gcd(res,l2-w);
res=gcd(res,2*w);
}
}
printf("%lld\n",res);
return 0;
}
/*
5 10
2 4 1
4 5 7
2 3 3
3 1 7
5 1 10
3 5 9
1 2 10
2 4 6
4 2 5
4 2 8
*/
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3828kb
input:
4 4 1 2 1 2 3 1 3 4 1 4 1 1
output:
4
result:
ok answer is '4'
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 3776kb
input:
4 5 1 2 1 1 3 2 1 4 1 2 3 1 3 4 1
output:
2
result:
wrong answer expected '4', found '2'