CF102A Clothes

题目简述一下,就是找出三件可以相匹配的衣服,且衣服和最小.

转化的想一想,把不同的衣服理解为几个地点,之间的关系理解为路,那这不就是一个简单的判断路的联通的问题了吗,

因为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;
 } 
原文地址:https://www.cnblogs.com/--840-114/p/13435804.html