• 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;
     } 
    
  • 相关阅读:
    Perl Resources
    使用Perl管理Oracle数据库
    Tomcat 发布部署jsp网站—-使用自己的ip访问jsp网站
    Lode's Computer Graphics Tutorial Image Filtering
    Java Image Filters
    ZPhotoEngine超级算法库
    ps亮度对比度算法
    滤镜艺术---新海诚(你的名字)滤镜特效的实现解密
    Cocoa-GL-Tutorial
    Learning Cocoa with Objective-C
  • 原文地址:https://www.cnblogs.com/--840-114/p/13435804.html
Copyright © 2020-2023  润新知