列表

详情


NC51294. GF和猫咪的玩具

描述

GF同学和猫咪得到了一个特别的玩具,这个玩具由n个金属环(编号为1—n),和m条绳索组成,每条绳索连接两个不同的金属环,并且长度相同。

GF左手拿起金属环L,猫咪右手(或者说:爪)拿起金属环R(L不等于R),然后尽量的向两边拉,他希望选择合适的L和R,使得被拉紧的绳索尽量的多。

注:如果像样例那样1-2-4-3-5-6-1构成了一个环,我们认为拉1和3时只能拉紧一边(1-2-4-3或3-5-6-1)而不算全部拉紧。

通俗地说,也就是当两个环之间有几个绳索数相等的连接方法时,只算其中一条连接方法拉紧,不算全部拉紧。

输入描述

第一行包含两个正整数n,m。
接下来的m行包含两个正整数a,b,表示有一条绳索连接了a和b的绳索。

输出描述

仅包含一个整数,表示最多能拉紧的绳索数。

示例1

输入:

6 6
1 2
1 6
2 4
6 5
4 3
5 3

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 424K, 提交时间: 2022-08-20 11:57:50

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 105;
const int inf = 0x3f3f3f3f;
int n,m;
int dis[MAXN][MAXN];
int ans;
int min(int x,int y){
    if(x>y) return y;
    return x;
}
inline void floyd(){
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(i!=j && j!=k && i!=k)
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
int main(){
    memset(dis,0x3f,sizeof(dis));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        dis[x][y]=dis[y][x]=1;
    }
    floyd();
    for(int i=1;i<=n;i++)
        for(int j=1;j<i;j++)
            if(dis[i][j]>ans)
                ans=dis[i][j];
    printf("%d\n",ans);
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 508K, 提交时间: 2020-02-12 20:14:36

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int mp[110][110];
int main(){
    int n,m,x,y;
    memset(mp,INF,sizeof(mp));
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;++i){
        scanf("%d%d",&x,&y);
        mp[x][y]=1;
        mp[y][x]=1;
    }
    for(int k=1;k<=n;++k)
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
    int ans=0;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            if(mp[i][j]!=INF)ans=max(ans,mp[i][j]);
    printf("%d",ans);
    return 0;
}

C++ 解法, 执行用时: 6ms, 内存消耗: 428K, 提交时间: 2022-04-16 18:40:34

#include<bits/stdc++.h>
using namespace std;
int e[105][105],n,m,t1,t2,ans;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i-j)e[i][j]=1e9;
	for(int i=1;i<=m;i++)cin>>t1>>t2,e[t1][t2]=1,e[t2][t1]=1;
	for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans=max(ans,e[i][j]);
	cout<<ans;
	return 0;
}

上一题