1.1013 Battle Over Cities (25 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805500414115840
输出cout会超时
#include<bits/stdc++.h>
using namespace std;
int n,m,k,de;
vector <int> G[1010];
bool visit[1010];
void init(){
for(int i=0;i<=n;i++){
visit[i]=false;
}
}
void dfs(int p){
if(p==de){
return ;
}
visit[p]=true;
for(unsigned int i=0;i<G[p].size();i++){
if(!visit[G[p][i]]){
dfs(G[p][i]);
}
}
return ;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
int l,r;
for(int i=0;i<m;i++){
scanf("%d%d",&l,&r);
G[l].push_back(r);
G[r].push_back(l);
}
for(int query=0;query<k;query++){
scanf("%d",&de);
init();
int cnt=0;
for(int i=1;i<=n;i++){
if(i==de)
continue;
if(!visit[i]){
dfs(i);
cnt++;
}
}
printf("%d\n",cnt-1);
}
return 0;
}
2.1021 Deepest Root (25 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856
#include<bits/stdc++.h>
using namespace std;
int n;
vector <int> G[10010];
set <int> a,b;
int level[10010];
int visit[10010];
int father[10010];
void init(){
for(int i=1;i<=n;i++){
father[i]=i;
}
}
bool IsOne(int a, int b){
int fa=a,fb=b;
while(father[fa]!=fa){
fa=father[fa];
}
while(father[fb]!=fb){
fb=father[fb];
}
int ca=a;
while(father[a]!=fa){
ca=father[a];
father[a]=fa;
a=ca;
}
int cb=b;
while(father[b]!=fb){
cb=father[b];
father[b]=fb;
b=cb;
}
if(fa==fb)
return true;
else return false;
}
void Union(int a, int b){
if(!IsOne(a,b)){
int f=father[a];
father[f]=b;
}
}
bool IsTree(){
int k=0;
for(int i=1;i<=n;i++){
if(father[i]==i)
k++;
}
if(k==1){
return true;
}
else {
printf("Error: %d components",k);
return false;
}
}
void bfs(int p,set <int> &pSet){
for(int i=1;i<=n;i++){
level[i]=0;
visit[i]=0;
}
queue <int> q;
q.push(p);
visit[p]=1;
int L=0;
int f=0;
while(!q.empty()){
f=q.front();
q.pop();
int cnt=0;
for(unsigned int i=0;i<G[f].size();i++){
if(visit[G[f][i]]==0){
level[G[f][i]]=level[f]+1;
visit[G[f][i]]=1;
q.push(G[f][i]);
cnt++;
}
}
if(cnt==0){
if(level[f]>L){
L=level[f];
}
}
}
for(int i=1;i<=n;i++){
if(level[i]==L){
pSet.insert(i);
}
}
}
int main(){
scanf("%d",&n);
int l,r;
init();
for(int i=1;i<n;i++) {
scanf("%d%d",&l,&r);
G[l].push_back(r);
G[r].push_back(l);
Union(l,r);
}
if(IsTree()){
bfs(1,a);
set <int>::iterator t1,t2;
t1=a.begin();
bfs(*t1,a);
for(t1=a.begin();t1!=a.end();t1++){
cout<<*t1<<endl;
}
}
return 0;
}
3.1034 Head of a Gang (30 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624
#include<bits/stdc++.h>
using namespace std;
int n,k;
map <string,int> person;
map <int,string> toName;
int w[2020];
int G[2020][2020];
bool edge[2020][2020];
bool visit[2020];
vector <int> result;
vector<int> P;
int Pre=1;
void dfs(int p,vector<int> &Point,int &sum){
Point.push_back(p);
visit[p]=true;
for(int i=1;i<Pre;i++){
if(i==p)continue;
if(G[p][i]!=0&&edge[p][i]==false){
edge[p][i]=true;
edge[i][p]=true;
sum+=G[p][i];
if(visit[i]==false)
{
dfs(i,Point,sum);
}
}
}
}
int main(){
scanf("%d%d",&n,&k);
char n1[1000],n2[1000];
int time;
map <string,int>::iterator it;
for(int i=1;i<2020;i++){
for(int j=1;j<2020;j++){
edge[i][j]=false;
G[i][j]=0;
}
}
for(int i=0;i<n;i++){
scanf("%s %s %d",n1,n2,&time);
string name1(n1),name2(n2);
if(person.find(name1)==person.end()){
person.insert(make_pair(name1,Pre));
toName.insert(make_pair(Pre,name1));
Pre++;
}
if(person.find(name2)==person.end()){
person.insert(make_pair(name2,Pre));
toName.insert(make_pair(Pre,name2));
Pre++;
}
w[person[name1]]+=time;
w[person[name2]]+=time;
G[person[name1]][person[name2]]+=time;
G[person[name2]][person[name1]]+=time;
}//共有[1,Pre-1]的人
for(int i=1;i<Pre;i++){
visit[Pre]=false;
}
int cnt=0,sum=0;
for(int i=1;i<Pre;i++){
if(!visit[i]){
P.clear();
sum=0;
dfs(i,P,sum);
if(P.size()>2&&sum>k){
int MaxNum=0,Max=0;
for(vector<int>::iterator it=P.begin();it!=P.end();it++){
if(w[*it]>Max){
MaxNum=*it;
Max=w[*it];
}
}
result.push_back(MaxNum);
result.push_back(P.size());
cnt++;
}
}
}
cout<<cnt<<endl;
map<string,int> out;
for(vector<int>::iterator it=result.begin();it!=result.end();it+=2){
out.insert(make_pair(toName[*it],*(it+1)));
}
for(map<string,int>::iterator it=out.begin();it!=out.end();it++){
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}
4.1076 Forwards on Weibo (30 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805392092020736
#include<bits/stdc++.h>
using namespace std;
int N,L;
vector<int> G[1010];
bool visit[1010];
int level[1010];
void init(){
for(int i=1;i<=N;i++){
visit[i]=false;
level[i]=0;
}
}
int bfs(int qry){
int re=0;
init();
queue <int> q;
q.push(qry);
visit[qry]=true;
int f;
while(!q.empty()){
f=q.front();
q.pop();
if(level[f]==L)
break;
for( vector<int>::iterator it=G[f].begin();it!=G[f].end();it++ ){
if(visit[*it]==false){
visit[*it]=true;
level[*it]=level[f]+1;
q.push(*it);
re++;
}
}
}
return re;
}
int main(){
cin>>N>>L;
for(int i=1;i<=N;i++){
int n;
cin>>n;
int temp;
for(int j=0;j<n;j++){
cin>>temp;
G[temp].push_back(i);
}
}
int times;
cin>>times;
for(int query=0;query<times;query++){
int qry;
cin>>qry;
cout<<bfs(qry)<<endl;
}
return 0;
}