zoukankan      html  css  js  c++  java
  • 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;
     } 
    
  • 相关阅读:
    在javaWeb 工程中 tomcat 的 web.xml 文件配置
    Spring 框架详解
    构建工具 Maven和Gradle对比
    idea 创建Javaweb 动态工程
    服务器后端 项目代码常用目录图
    ET模式下的EPOLLOUT
    linux recv 参数len设置为0
    fork 和 exec 对子进程继承父进程处理信号处理函数的影响
    lua元表以及元方法
    Linux网络编程“惊群”问题总结
  • 原文地址:https://www.cnblogs.com/--840-114/p/13435804.html
Copyright © 2011-2022 走看看