P3367 【模板】并查集 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
using namespace std;
int n,m,i,j;
int pre[10004],deep[10004];
int root(int x)
{
if(pre[x]==x) return x;
return pre[x]=root(pre[x]);
}
void join(int x,int y)
{
x=root(x);
y=root(y);
if(x==y) return;
if(deep[x]>deep[y]) pre[y]=x;
else
{
pre[x]=y;
if(deep[x]==deep[y]) deep[y]++;
}
}
void judge(int x,int y)
{
if(root(x)==root(y))
{
cout<<'Y'<<endl;
}
else{
cout<<'N'<<endl;
}
}
int main()
{
cin>>n>>m;
for(i=1;i<=n;i++)
{
pre[i]=i;
deep[i]=1;
}
for(i=1;i<=m;i++)
{
int z,x,y;
cin>>z>>x>>y;
if(z==2)
{
judge(x,y);
}
else
{
join(x,y);
}
}
}
P8604 [蓝桥杯 2013 国 C] 危险系数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
using namespace std;
long long n,m,u,v,visit[1010],sum,ant,sumn[1010];
long long a[1010][1010];
void dfs(long long now)
{
if(now==v)
{
ant++;
for(int i=1;i<=n;i++)
{
if(visit[i]==1)
{
sumn[i]++;
}
}
}
else
for(int i=1;i<=n;i++)
{
if(a[now][i]&&visit[i]==0)
{
visit[i]=1;
dfs(i);
visit[i]=0;
}
}
}
int main()
{
int i;
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>u>>v;
a[u][v]=a[v][u]=1;
}
cin>>u>>v;
dfs(u);
if(ant==0)
{
cout<<"-1";
return 0;
}
for(i=1;i<=n;i++)
{
if(sumn[i]==ant)
{
sum++;
}
}
sum--;
cout<<sum;
}
P1330 封锁阳光大学 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
using namespace std;
int n,m,u,v,cnt,head[100005];
int used[100005],col[100005],sum[2];
struct edge
{
int to;
int next;
};
edge e[200005];
int min(int x,int y)
{
if(x<y) return x;
return y;
}
bool dfs(int now,int color)
{
if(used[now])
{
if(color==col[now]) return true;
return false;
}
used[now]=1;
col[now]=color;
sum[color]++;
bool tp=true;
for(int i=head[now];i&&tp;i=e[i].next)
{
tp=tp&&dfs(e[i].to,1-color);
}
return tp;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
cnt++;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
cnt++;
e[cnt].to=u;
e[cnt].next=head[v];
head[v]=cnt;
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(used[i])
{
continue;
}
sum[1]=sum[0]=0;
if(!dfs(i,0))
{
cout<<"Impossible";
return 0;
}
ans+=min(sum[1],sum[0]);
}
cout<<ans;
}
P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int m,n,i,j,u,v;
int ans[100005];
int visit[100005];
vector<int>node[100005];
int main()
{
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>u>>v;
node[v].push_back(u);
}
for(i=1;i<=n;i++)
{
ans[i]=i;
}
for(i=n;i>=1;i--)
{
if(visit[i]==1) continue;
if(node[i].empty())
{
visit[i]=1;
continue;
}
queue<int>qu;
qu.push(i);
visit[i]=1;
while(!qu.empty())
{
int le=qu.front();
qu.pop();
for(j=0;j<node[le].size();j++)
{
if(visit[node[le][j]]==1) continue;
qu.push(node[le][j]);
visit[node[le][j]]=1;
ans[node[le][j]]=i;
}
}
}
for(i=1;i<=n;i++)
{
cout<<ans[i]<<' ';
}
}
/*
8 10
1 2
2 3
2 6
3 4
3 5
5 1
6 7
8 7
8 1
8 4
*/
P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<fstream>
#include<cmath>
using namespace std;
const int N=209,oo=0x3fffffff;
int n,m,q,dis[N][N],t[N],cnt(0);
void init(){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(i==j) continue;
dis[i][j]=oo;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&t[i]);
init();
for(int i=1,a,b,c;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
dis[a][b]=dis[b][a]=c;
}
scanf("%d",&q);
for(int cnm=1,x,y,z;cnm<=q;cnm++){
scanf("%d%d%d",&x,&y,&z);
while(t[cnt]<=z && cnt<n){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
dis[i][j]=min(dis[i][j],dis[i][cnt]+dis[cnt][j]);
}
cnt++;
}
if(dis[x][y]==oo || t[x]>z || t[y]>z){
printf("-1\n");
continue;
}
printf("%d\n",dis[x][y]);
}
return 0;
}