#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1000+10;
int vis[maxn][2],dp[maxn][2];
int n,m;
vector<vector<int> > adj(maxn);
int dfs(int i,int j,int f)
{
if(vis[i][j]) return dp[i][j];
vis[i][j]=1;
int &ans=dp[i][j];
ans=2000;
for(int k=0;k<adj[i].size();k++)
if(adj[i][k]!=f)
ans+=dfs(adj[i][k],1,i);
if(!j&&f>=0) ans++;
if(j||f<0)
{
int sum=0;
for(int k=0;k<adj[i].size();k++)
if(adj[i][k]!=f)
sum+=dfs(adj[i][k],0,i);
if(f>=0) sum++;
ans=min(ans,sum);
}
return ans;
}
int main()
{
std::ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
cin>>n>>m;
for(int i=0;i<n;i++) adj[i].clear();
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
int ans=0;
for(int i=0;i<n;i++){
if(!vis[i][0])
ans+=dfs(i,0,-1);
}
printf("%d %d %d\n",ans/2000,m-ans%2000,ans%2000);
}
return 0;
}
UVA 10859 Placing Lampposts(记忆化搜索)
最新推荐文章于 2017-01-24 13:27:06 发布