题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1926
题意:n个环m条绳子,问挑两个环拉直后最多有多少条绳子绷直。
主要思想就是暴力枚举。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b) for(i = a; i <= b; i++)
#define FREE(i,a,b) for(i = a; i >= b; i--)
#define FRL(i,a,b) for(i = a; i < b; i++)
#define FRLL(i,a,b) for(i = a; i > b; i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define DBG pf("Hi\n")
typedef long long ll;
using namespace std;
#define INF 0x3f3f3f3f
#define mod 1000000009
const int maxn = 1005;
const int MAXN = 2005;
const int MAXM = 200010;
const int N = 1005;
int n,m;
int mp[maxn][maxn],g[maxn][maxn];
int a[maxn];
void floyd()
{
for (int k=0;k<n;k++)
{
for (int i=0;i<n;i++)
{
if (mp[i][k]==INF) continue;
for (int j=0;j<n;j++)
{
if (mp[j][k]==INF) continue;
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin);
#endif
int i,j,k,T,u,v,cas=0;
sf(T);
while (T--)
{
sff(n,m);
for (i=0;i<=n;i++)
{
for (j=0;j<=n;j++)
{
if (i==j)mp[i][j]=g[i][j]=0;
else mp[i][j]=g[i][j]=INF;
}
}
for (i=0;i<m;i++)
{
sff(u,v);
mp[u][v]=mp[v][u]=g[u][v]=g[v][u]=1;
}
floyd();
int ans=0;
for (i=0;i<n;i++)
{
for (j=i+1;j<n;j++)
{
if (mp[i][j]==INF) continue;
int temp=0;
int cnt=0;
for (k=0;k<n;k++)
if(mp[i][j]==mp[i][k]+mp[k][j])
a[cnt++]=k;
// if (i==0&&j==2)
// {
// printf("cnt=%d\n",cnt);
// for (k=0;k<cnt;k++)
// pf(" %d",a[k]);
// printf("\n");
// }
for (int x=0;x<cnt;x++) //这一步理解很关键
for (int y=x+1;y<cnt;y++)
if (g[a[x]][a[y]]==1&&mp[i][a[x]]!=mp[i][a[y]]) temp++;
ans=max(ans,temp);
}
}
printf("Case #%d: %d\n",++cas,ans);
}
return 0;
}