宝藏

来源:互联网 发布:java实现通用日志记录 编辑:程序博客网 时间:2024/04/28 22:24
G

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 333 Solved: 71

SubmitStatusWeb Board
Description

晴天也来寻宝啦,有一个m层的宝塔,只能从第一层开始一层一层的往上走,每层都有一个门,你需要用钥匙来打开门才能继续走,现在晴天有n把钥匙,编号为0-n-1,然后他要开始寻宝了。没有特殊技能怎么好意思出来寻宝呢,他现在有两个天赋技能,他知道第i层的门可以用编号为a和b的钥匙打开(可能a等于b呦),然后他还可以在进入宝塔前把门的顺序任意调换一次,也就是说比如可以把m层原来的1 2 3 ..m,换为 m ...3 2 1.晴天想知道他最多能拿到多少层的宝物。

Input

第一行一个整数t表示有多少组测试实例

每组数据第一行为两个整数n,m分别表示有多少个钥匙,有多少层。

接下来m行,每行两个数字x,y,第i行表示第i层的门可以用标号x或y的钥匙打开。

(n,m<=1000)

Output

输出一个整数表示最多可以上多少层。

Sample Input

1
3 4
0 1
0 1
0 1
1 2
Sample Output

3
HINT

在样例中,在进入宝塔前,将门的顺序换为4 1 2 3.然后前三层分别使用2 0 1三把钥匙拿到前三层的宝物

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int link[1010][1010];int biao[1010];//标记第i层门是否被打开 int vis[1010];int n,m;bool dfs(int x)//x为钥匙编号 ; {for(int i=0;i<m;i++)//i为楼层; {if(biao[i]==0&&link[i][x]==1)//第i层还没有被访问并且钥匙x能打开第i层的门; {biao[i]=1;//访问第i层的门; if(vis[i]==-1||dfs(vis[i]))//如果第i层门还没被打开或有别的钥匙能打开 {vis[i]=x;return true;}}}return false;}int main(){int ans;int t;scanf("%d",&t);while(t--){ans=0;memset(vis,-1,sizeof(vis));//编号从0开始嘛,傻了吧唧的初始化个0000000 memset(link,0,sizeof(link));scanf("%d%d",&n,&m);for(int i=0;i<m;i++){int key1,key2;scanf("%d%d",&key1,&key2);link[i][key1]=1;link[i][key2]=1;}for(int i=0;i<n;i++){memset(biao,0,sizeof(biao));if(dfs(i))ans++;}printf("%d\n",ans);}return 0;}//二分图EEEEE


0 0
原创粉丝点击