比赛 难度范围:提高至省选 评测结果 AAAAAAAAAA
题目名称 荒野迷路 最终得分 100
用户昵称 cstdio 运行时间 1.479 s
代码语言 C++ 内存使用 5.10 MiB
提交时间 2014-10-16 17:36:11
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<iomanip>
#include<queue>
#include<set>
#include<map>
using namespace std;
const int SIZEN=501,SIZEK=5001;
bool win[SIZEN][SIZEK]={0},vis[SIZEN][SIZEK]={0};
int N,M,K;
vector<pair<int,int> > c[SIZEN];
bool surewin(int n,int k){
	if(vis[n][k]) return win[n][k];
	vis[n][k]=true;
	for(int i=0;i<c[n].size();i++){
		if(c[n][i].second<=k){
			if(!surewin(c[n][i].first,k-c[n][i].second)) return win[n][k]=true;
		}
	}
	return win[n][k]=false;
}
void read(void){
	memset(win,0,sizeof(win));
	memset(vis,0,sizeof(vis));
	memset(c,0,sizeof(c));
	scanf("%d%d%d",&K,&N,&M);
	for(int i=1;i<=N;i++) c[i].clear();
	for(int i=1;i<=M;i++){
		int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
		c[a].push_back(make_pair(b,w));
		c[b].push_back(make_pair(a,w));
	}
}
int main(){
	freopen("fieldlost.in","r",stdin);
	freopen("fieldlost.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--){
		read();
		if(surewin(1,K)) printf("Yes!\n");
		else printf("No!\n");
	}
	return 0;
}