搜索
7-1 列出连通集 (25 分)
答案
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 11;
using namespace std;
int n,m;
int mp[N][N];
bool vis[N];
void DFS(int u){
if(u>=n) return ;
cout<<" "<<u;
vis[u]=1;
for(int i=0;i<n;i++){
if(!vis[i]&&mp[u][i]){
DFS(i);
}
}
}
void BFS(int u){
queue<int>q;
q.push(u);
vis[u]=1;
while(q.size()){
int t=q.front();
q.pop();
cout<<" "<<t;
for(int i=0;i<n;i++){
if(!vis[i]&&mp[t][i]){
q.push(i);
vis[i]=1;
}
}
}
}
int main(){
cin>>n>>m;
while(m--){
int u,v;
cin>>u>>v;
mp[u][v]=mp[v][u]=1;
}
for(int i=0;i<n;i++){
if(!vis[i]){
cout<<"{";
DFS(i);
cout<<" }"<<endl;
}
}
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
if(!vis[i]){
cout<<"{";
BFS(i);
cout<<" }"<<endl;
}
}
return 0;
}
7-2 Saving James Bond - Easy Version (25 分)
答案
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int,int>
#define pb push_back
const int N = 1e5 + 10;
using namespace std;
struct node{
int x;
int y;
}dp[N];
int n,d;
bool vis[N];
bool flag;
bool fp(int x){
int px=pow(dp[x].x,2);
int py=pow(dp[x].y,2);
int r=(d+7.5)*(d+7.5);
if(px+py<=r) return 1;
return 0;
}
bool jump(int x,int y){ ///判断是否可以跳到另一个鳄鱼头
int px=pow(dp[x].x-dp[y].x,2);
int py=pow(dp[x].y-dp[y].y,2);
int r=d*d;
if(px+py<=r) return 1;
return 0;
}
bool judge(int x){ ///判断是否可以到达岸边
if((dp[x].x-d<=-50)||(dp[x].x+d>=50)||(dp[x].y-d<=-50)||(dp[x].y+d>=50)) return 1;
return 0;
}
bool DFS(int x){
vis[x]=1;
if(judge(x)) flag=1;
for(int i=0;i<n;i++){
if(!vis[i]&&jump(x,i)){
flag=DFS(i);
}
}
return flag;
}
void solve(){
memset(vis,0,sizeof(vis));
cin>>n>>d;
for(int i=0;i<n;i++){
cin>>dp[i].x>>dp[i].y;
}
if(d>=42.5) puts("Yes");
else{
for(int i=0;i<n;i++){
if(!vis[i]&&fp(i)){
DFS(i);
}
}
if(flag) puts("Yes");
else puts("No");
}
}
int main()
{
solve();
return 0;
}
7-3 地下迷宫探索 (30 分)
答案
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 1e4 + 10;
using namespace std;
int n,m,pos;
int mp[N][N];
int tot;
int dp[N];
bool vis[N];
bool flag;
void DFS(int u){
//if(tot>=n) return ;
// vis[u]=1;
// cout<<u<<" ";
if(flag) cout<<" ";
else flag=1;
cout<<u;
dp[++tot]=u;
for(int i=1;i<=n;i++){
if(!vis[i]&&mp[u][i]){
vis[i]=1;
DFS(i);
cout<<" "<<u;
}
}
}
int main(){
cin>>n>>m>>pos;
while(m--){
int u,v;
cin>>u>>v;
mp[u][v]=mp[v][u]=1;
}
tot=0;
flag=0;
vis[pos]=1;
DFS(pos);
// if(tot==n){
// for(int i=1;i<tot;i++){
// cout<<dp[i]<<" ";
// }
// for(int i=tot;i>=1;i--){
// if(i==1) cout<<dp[i]<<endl;
// else cout<<dp[i]<<" ";
// }
// }
// else{
// for(int i=1;i<tot;i++){
// cout<<dp[i]<<" ";
// }
// for(int i=tot;i>=1;i--){
// if(i==1) cout<<dp[i]<<" 0"<<endl;
// else cout<<dp[i]<<" ";
// }
// }
if(tot<n) puts(" 0");
return 0;
}
7-4 畅通工程之局部最小花费问题 (35 分)
答案
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int,int>
const int N = 1e5 + 10;
using namespace std;
struct node{
int u;
int v;
int w;
int p;
}dp[N];
int vis[N];
bool cmp(node x,node y){
return x.w<y.w;
}
int Find(int x){
if(x!=vis[x]) vis[x]=Find(vis[x]);
return vis[x];
}
void solve(){
int n;
cin>>n;
int m=n*(n-1)>>1;
for(int i=1;i<=m;i++) vis[i]=i;
for(int i=1;i<=m;i++){
int u,v,w,p;
cin>>u>>v>>w>>p;
dp[i]={u,v,w,p};
if(dp[i].p==1){
int x=Find(dp[i].u);
int y=Find(dp[i].v);
if(x!=y){
vis[x]=y;
}
}
}
sort(dp+1,dp+1+m,cmp);
int minn=0;
for(int i=1;i<=m;i++){
int x=Find(dp[i].u);
int y=Find(dp[i].v);
if(x!=y){
vis[x]=y;
minn+=dp[i].w;
}
}
cout<<minn<<endl;
}
int main()
{
solve();
return 0;
}
7-5 List Components (25 分)
答案
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 11;
using namespace std;
int n,m;
int mp[N][N];
bool vis[N];
void DFS(int u){
if(u>=n) return ;
cout<<" "<<u;
vis[u]=1;
for(int i=0;i<n;i++){
if(!vis[i]&&mp[u][i]){
DFS(i);
}
}
}
void BFS(int u){
queue<int>q;
q.push(u);
vis[u]=1;
while(q.size()){
int t=q.front();
q.pop();
cout<<" "<<t;
for(int i=0;i<n;i++){
if(!vis[i]&&mp[t][i]){
q.push(i);
vis[i]=1;
}
}
}
}
int main(){
cin>>n>>m;
while(m--){
int u,v;
cin>>u>>v;
mp[u][v]=mp[v][u]=1;
}
for(int i=0;i<n;i++){
if(!vis[i]){
cout<<"{";
DFS(i);
cout<<" }"<<endl;
}
}
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
if(!vis[i]){
cout<<"{";
BFS(i);
cout<<" }"<<endl;
}
}
return 0;
}
7-6 排座位 (25 分)
答案
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-8
#define x first
#define y second
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 1e4 + 10;
const int M = 111;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;
int vis[N];
int mp[N][N];
void init(int n){
for(int i=1;i<=n;i++) vis[i]=i;
}
int Find(int x){
if(x!=vis[x]) vis[x]=Find(vis[x]);
return vis[x];
}
void Merge(int u,int v){
int x=Find(u);
int y=Find(v);
if(x!=y) vis[x]=y;
}
void solve(){
int n,m,k;
cin>>n>>m>>k;
init(n);
while(m--){
int u,v;
int op;
cin>>u>>v>>op;
mp[u][v]=mp[v][u]=op;
if(op==1) Merge(u,v);
}
while(k--){
int x,y;
cin>>x>>y;
if(mp[x][y]==1) cout<<"No problem"<<endl;
else if(mp[x][y]!=1&&mp[x][y]!=-1) cout<<"OK"<<endl;
else if(mp[x][y]==-1&&Find(x)==Find(y)) cout<<"OK but..."<<endl;
else if(mp[x][y]==-1&&Find(x)!=Find(y)) cout<<"No way"<<endl;
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}
7-7 红色警报 (25 分)
答案
#include <iostream>
#include<bits/stdc++.h>
#define PII pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 555;
using namespace std;
int n,m;
int mp[N][N];
bool vis[N];
int tot;
void DFS(int p){ ///DFS寻找连通分量个数
for(int i=0;i<n;i++){
if(!vis[i]&&mp[p][i]){
vis[i]=1;
DFS(i);
}
}
}
int main(){
cin>>n>>m;
while(m--){
int u,v;
cin>>u>>v;
mp[u][v]=mp[v][u]=1; ///连通u,v
}
for(int i=0;i<n;i++){ ///先计算连通分量的个数
if(!vis[i]){
DFS(i);
tot++;
}
}
// cout<<tot<<endl;
int q;
cin>>q;
int cnt;
int num=q;
while(q--){
int x;
cin>>x;
for(int i=0;i<n;i++){
///将所有与x相连的点取消连通标
if(mp[x][i]) mp[x][i]=mp[i][x]=0;
}
cnt=0;
mem(vis,0);
///当去掉City x的连通分量个数
for(int i=0;i<n;i++){
if(!vis[i]){
DFS(i);
cnt++;
}
}
// cout<<tot<<" "<<cnt<<endl;
// cout<<cnt<<endl;
///当失去City x时,更改了其他城市的连通性,即连通分量增加了2以上
if(cnt>=tot+2) printf("Red Alert: City %d is lost!\n",x);
else printf("City %d is lost.\n",x);
tot=cnt;
}
if(num>=n) cout<<"Game Over."<<endl;
return 0;
}
7-8 愿天下有情人都是失散多年的兄妹 (25 分)
答案
#include <iostream>
#include<bits/stdc++.h>
#define PII pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 1e5 + 10;
using namespace std;
struct node{
// int id;
int sex;
int fid=-1;
int mid=-1;
}dp[N];
bool vis[N];
bool flag;
void DFS(int id,int tot){
if(id==-1) return ;
if(tot>5) return ;
vis[id]=1;
DFS(dp[id].fid,tot+1);
DFS(dp[id].mid,tot+1);
}
void judge(int id,int tot){
if(id==-1) return ;
if(tot>5) return ;
if(vis[id]){
flag=1;
return ;
}
judge(dp[id].fid,tot+1);
judge(dp[id].mid,tot+1);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int id;
string s;
cin>>id>>s;
if(s=="M") dp[id].sex=1;
else dp[id].sex=-1;
cin>>dp[id].fid>>dp[id].mid;
dp[dp[id].fid].sex=1;
dp[dp[id].mid].sex=-1;
}
int q;
cin>>q;
while(q--){
int x,y;
cin>>x>>y;
if(dp[x].sex==dp[y].sex) cout<<"Never Mind"<<endl;
else{
mem(vis,0);
DFS(x,1);
flag=0;
judge(y,1);
if(flag) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
return 0;
}
7-9 家庭房产 (25 分)
答案
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-8
#define x first
#define y second
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 1e5 + 10;
const int M = 555;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;
struct data{
int id;
int fa;
int mo;
int num;
int area;
int cp[M];
}dp[N];
struct node{
int id;
int peo;
double num;
double area;
bool flag=0;
}mp[N];
int fat[N];
bool vis[N];
int Find(int x){
if(fat[x]!=x) fat[x]=Find(fat[x]);
return fat[x];
}
//int Find(int x){
// while(x!=fat[x]) x=fat[x];
// return x;
//}
void Merge(int u,int v){
int x=Find(u);
int y=Find(v);
if(x>y) fat[x]=y;
else if(x<y) fat[y]=x;
}
bool cmp(node x,node y){
if(x.area!=y.area) return x.area>y.area;
else return x.id<y.id;
}
void init(int n){
rep(i,0,10000) fat[i]=i;
}
void solve(){
int n;
int k;
int tot=0;
cin>>n;
init(n);
rep(i,0,n-1){
cin>>dp[i].id>>dp[i].fa>>dp[i].mo>>k;
vis[dp[i].id]=1;
if(dp[i].fa!=-1){
vis[dp[i].fa]=1;
Merge(dp[i].fa,dp[i].id);
}
if(dp[i].mo!=-1){
vis[dp[i].mo]=1;
Merge(dp[i].mo,dp[i].id);
}
rep(j,0,k-1){
cin>>dp[i].cp[j];
vis[dp[i].cp[j]]=1;
Merge(dp[i].cp[j],dp[i].id);
}
cin>>dp[i].num>>dp[i].area;
}
rep(i,0,n-1){
int id=Find(dp[i].id);
mp[id].id=id;
mp[id].num+=dp[i].num;
mp[id].area+=dp[i].area;
mp[id].flag=1;
}
rep(i,0,10000){
if(vis[i]) mp[Find(i)].peo++;
if(mp[i].flag) tot++;
}
rep(i,0,10000){
if(mp[i].flag){
mp[i].num=(double)(mp[i].num*1.0/mp[i].peo);
mp[i].area=(double)(mp[i].area*1.0/mp[i].peo);
}
}
sort(mp,mp+10000,cmp);
cout<<tot<<endl;
rep(i,0,tot-1){
printf("%04d %d %.3f %.3f\n",mp[i].id,mp[i].peo,mp[i].num,mp[i].area);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}
7-10 功夫传人 (25 分)
答案
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int,int>
#define pb push_back
const int N = 1e5 + 10;
using namespace std;
struct node{
double w;
int k;
vector<int>vp;
}dp[N];
int n;
double z,r;
double sum;
void DFS(int x){
// cout<<x<<" "<<"***"<<endl;
if(!dp[x].vp.size()){
dp[x].w*=dp[x].k;
// cout<<x<<" "<<dp[x].w<<endl;
sum+=dp[x].w;
return ;
}
// if(x>=n) return ;
for(int i=0;i<(int)dp[x].vp.size();i++){
int j=dp[x].vp[i];
dp[j].w=dp[x].w*1.0*(100-r)/100;
DFS(j);
}
}
void solve(){
cin>>n>>z>>r;
for(int i=0;i<n;i++){
int k;
cin>>k;
if(!k){
cin>>k;
dp[i].k=k;
}
else{
while(k--){
int x;
cin>>x;
dp[i].vp.pb(x);
// dp[x].pre=i;
}
}
}
// cout<<"***"<<endl;
dp[0].w=z;
DFS(0);
cout<<(int)sum<<endl;
}
int main()
{
solve();
return 0;
}
7-11 图着色问题 (25 分)
答案
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 1e4 + 10;
using namespace std;
int v,e,k;
int mp[N][N];
int col[N];
bool vis[N];
bool vp[N];
bool flag;
void DFS(int u){
vis[u]=1;
vp[u]=1;
for(int i=1;i<=v;i++){
if(mp[u][i]){
if(col[i]==col[u]){
flag=1;
break;
}
if(!vis[i]) DFS(i);
}
}
// vis[u]=0;
}
int main(){
cin>>v>>e>>k;
while(e--){
int u,v;
cin>>u>>v;
mp[u][v]=mp[v][u]=1;
}
int q;
cin>>q;
while(q--){
set<int>st;
memset(vis,0,sizeof(vis));
memset(vp,0,sizeof(vp));
for(int i=1;i<=v;i++){
cin>>col[i];
st.insert(col[i]);
}
if((int)st.size()!=k){
puts("No");
continue;
}
flag=0;
// for(int i=1;i<=v;i++) BFS(i);
for(int i=1;i<=v;i++) if(!vp[i]&&!flag) DFS(i);
if(!flag) puts("Yes");
else puts("No");
}
return 0;
}
7-12 拯救007 (25 分)
答案
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int,int>
#define pb push_back
const int N = 1e5 + 10;
using namespace std;
struct node{
int x;
int y;
}dp[N];
int n,d;
bool vis[N];
bool flag;
bool fp(int x){
int px=pow(dp[x].x,2);
int py=pow(dp[x].y,2);
int r=(d+7.5)*(d+7.5);
if(px+py<=r) return 1;
return 0;
}
bool jump(int x,int y){ ///判断是否可以跳到另一个鳄鱼头
int px=pow(dp[x].x-dp[y].x,2);
int py=pow(dp[x].y-dp[y].y,2);
int r=d*d;
if(px+py<=r) return 1;
return 0;
}
bool judge(int x){ ///判断是否可以到达岸边
if((dp[x].x-d<=-50)||(dp[x].x+d>=50)||(dp[x].y-d<=-50)||(dp[x].y+d>=50)) return 1;
return 0;
}
bool DFS(int x){
vis[x]=1;
if(judge(x)) flag=1;
for(int i=0;i<n;i++){
if(!vis[i]&&jump(x,i)){
flag=DFS(i);
}
}
return flag;
}
void solve(){
memset(vis,0,sizeof(vis));
cin>>n>>d;
for(int i=0;i<n;i++){
cin>>dp[i].x>>dp[i].y;
}
if(d>=42.5) puts("Yes");
else{
for(int i=0;i<n;i++){
if(!vis[i]&&fp(i)){
DFS(i);
}
}
if(flag) puts("Yes");
else puts("No");
}
}
int main()
{
solve();
return 0;
}
测试点样例打表(学弟发现 tql):
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int N = 1e4 + 10;
using namespace std;
int main(){
int a,b;
cin>>a>>b;
if(a==4||a==100||a==5) puts("No");
else puts("Yes");
return 0;
}