题目简述一下,就是找出三件可以相匹配的衣服,且衣服和最小.
转化的想一想,把不同的衣服理解为几个地点,之间的关系理解为路,那这不就是一个简单的判断路的联通的问题了吗,
因为n≤100,所以我们可以跑一个Floyd,来判断路的联通,注意要考虑不可能为同一件衣服,所以i,j,k要为不同的三个数
在打Floyd的时候,为了减少一个循环的次数,让k的循环从1->n-2,i的循环从k+1->n-1,j的循环从i+1->n,这样就避免了i,j,k相同的情况
for(int k=1;k<n-1;k++)
{
for(int i=k+1;i<n;i++)
{
for(int j=i+1;j<=n;j++)//减少循环量,同时排除i=j=k的情况
{
存图的时候,由于数据原因,(\(n≤100\))利用二维数组存图,\(b[i][j]\)表示从i到j存在关系
int add(int x,int y)
{
b[x][y]=1;
b[y][x]=1;
}
最终的AC代码如下
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[105];
int b[105][105];//利用邻接矩阵存图
int ans=2147483647;//把ans赋值为int的最大值
bool pd(int a,int b,int c)
{
if(a==b&&b==c&&a==1) return true;
return false;
}//一个判断函数,减少代码量
int add(int x,int y)
{
b[x][y]=1;
b[y][x]=1;
}
int main()
{
cin>>n>>m;
bool flag=false;//打一个标记
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
add(x,y);//双向存图,不用考虑边权
}
for(int k=1;k<n-1;k++)
{
for(int i=k+1;i<n;i++)
{
for(int j=i+1;j<=n;j++)//减少循环量,同时排除i=j=k的情况
{
if(pd(b[i][j],b[i][k],b[j][k]))
{
ans=min(ans,a[i]+a[j]+a[k]);//实时更新ans
flag=true;//若是存在则记号为true
}
}
}
}
if(flag==true) cout<<ans<<endl;//利用记号输出
else cout<<"-1"<<endl;
return 0;
}