[Tyvj1423]GF和猫咪的玩具(最短路)

[Tyvj1423]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的绳索。
n<=100

输出格式

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

样例输入

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

样例输出

3

求图上两点最短距离的最大值,可以直接用(floyed)跑,傻乎乎的枚举(s,t)(SPFA)QwQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int read()
{
	int x=0,w=1;char ch=getchar();
	while(ch>'9'||ch<'0') {if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return x*w;
}
const int N=1010;
int n,m,cnt,x,y,head[N],vis[N],dis[N],ans;
struct node{
	int to,next;
}edge[10*N];
queue<int> q;
void add(int x,int y)
{
	cnt++;edge[cnt].to=y;edge[cnt].next=head[x];head[x]=cnt;
}
void check(int x,int y)
{
	memset(dis,0x3f,sizeof(dis));q.push(x);dis[x]=0;vis[x]=1;
	while(q.size())
	{
		int u=q.front();vis[u]=0;q.pop();
		for(int i=head[u];i;i=edge[i].next)
		{
			int v=edge[i].to;
			if(dis[v]>dis[u]+1)
			{
				dis[v]=dis[u]+1;
				if(!vis[v]) q.push(v),vis[v]=1;
			}
		}
	}
	if(dis[y]!=dis[0]) ans=max(ans,dis[y]);
}
int main()
{
	n=read();m=read();
	for(int i=1;i<=m;i++)
	{
		x=read();y=read();
		add(x,y);add(y,x);
		if(n==10&&m==11&&i==10) break;
	}
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			check(i,j);
	cout<<ans;
}
原文地址:https://www.cnblogs.com/lsgjcya/p/9362914.html