题目链接:https://nanti.jisuanke.com/t/11132
首先要搞懂一个概念:互质即两个数的最大公约数为1,利用Floyd求出两点之间的最短路。
github:https://github.com/xuna123/ACM/commit/cf806028c8cb51f0456e2bd23c9d38db04070e9a
我的代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#define inf 0x3f3f3f3f
using namespace std;
int gyd(int n,int m)
{
if(n<m) swap(n,m);
if(m==0) return n;
else
return gyd(m,n%m);
}
int main()
{
int a[501],sum=0,n,i,j,x,y,b[501][501];
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(i==j) b[i][j]=0;
else b[i][j]=inf;
}
for(i=1; i<n; i++)
{
scanf("%d%d",&x,&y);
b[x][y]=b[y][x]=1;
}
for(int k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(b[i][j]>b[i][k]+b[k][j])
b[i][j]=b[i][k]+b[k][j];
}
for(i=1; i<=n; i++)
for(j=i+1; j<=n; j++)
{
if(gyd(a[i],a[j])==1)
sum+=b[i][j];
}
printf("%d\n",sum);
return 0;
}