#include<bits/stdc++.h>usingnamespace std;int n,m;int z,x,y;int f[20005];intfind(int x){if(x == f[x])return x;
f[x]=find(f[x]);return f[x];}intmain(){
cin >> n >> m;for(int i=1;i<=n;++i){
f[i]=i;}for(int i=1;i<=m;++i){
cin >> z >> x >> y;if(z==1)
f[find(x)]=find(y);elseif(find(x)==find(y))printf("Y\n");elseprintf("N\n");}return0;}
dijkstra堆优化pair版
#include<bits/stdc++.h>usingnamespace std;int n, m, s;//s为出发点int vis[100005], dis[100005], u;//flag表示这个点是否被访问过,d表示从起点到下标的最优解u表示当前点structnode{int x, w;//x为编号,w为权值};
vector<node> G[100005];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;//定义了从小到大的pair型优先队列constint inf =0x3f3f3f;intmain(){// freopen("dijkstra.in","r",stdin);// freopen("dijkstra.out","w",stdout);
cin >> n >> m >> s;for(int i =1; i <= n; i++){
dis[i]= inf;}for(int i =1; i <= m; i++){int u, v, w;
cin >> u >> v >> w;
G[u].push_back(node{v, w});}// u = s;//把起点标记为第一个u
q.push(make_pair(0,s));//将起点压入q
dis[s]=0;while(!q.empty()){//只要还有点没被访问算法就不会结束
u=q.top().second;//取队首编号
vis[u]=1;for(int i =0; i < G[u].size(); i++){int v = G[u][i].x;//v为编号int w = G[u][i].w;//w为权值if(!vis[v]&&dis[v]>dis[u]+w){//如果新的解比原来的解大并且这个点没有被访问就进行松弛操作//进行松弛操作,更新最优解
dis[v]=dis[u]+w;
q.push(make_pair(dis[v],v));}}
q.pop();}for(int i =1; i <= n; i++){if(dis[i]== inf){printf("2147483647 ");}else{
cout << dis[i]<<" ";}}return0;}
dijkstra未优化版
#include<bits/stdc++.h>usingnamespace std;int n, m, s;//s为出发点int flag[10005], d[10005], u;//flag表示这个点是否被访问过,d表示从起点到下标的最优解u表示当前点structnode{int x, w;//x为编号,w为权值};
vector<node> G[10005];constint inf =0x3f3f3f;intmain(){
cin >> n >> m >> s;for(int i =1; i <= n; i++){
d[i]= inf;}for(int i =1; i <= m; i++){int u, v, w;
cin >> u >> v >> w;
G[u].push_back(node{v, w});}
u = s;//把起点标记为第一个u
d[s]=0;while(!flag[u]){//只要还有点没被访问算法就不会结束
flag[u]=1;for(int i =0; i < G[u].size(); i++){int v = G[u][i].x;//v为编号int w = G[u][i].w;//w为权值if(flag[v]==0){//如果新的解比原来的解大并且这个点没有被访问就进行松弛操作//进行松弛操作,更新最优解
d[v]=min(d[v], d[u]+ w);}}int tmp =0x3f3f3f3f;for(int i =1; i <= n; i++){//找最小值if(tmp > d[i]&& flag[i]==0){
tmp = d[i];
u = i;//将最小的值作为新的u}}}for(int i =1; i <= n; i++){if(d[i]==4144959){printf("2147483647 ");}else{
cout << d[i]<<" ";}}return0;
dijkstra堆优化优先队列版
#include<bits/stdc++.h>usingnamespace std;int n, m, s;//s为出发点int vis[200005], dis[200005], u;//flag表示这个点是否被访问过,d表示从起点到下标的最优解u表示当前点structnode{int w, x;//x为编号,w为权值};
vector<node> G[200005];
priority_queue<pair<int,int>> q;//定义了从小到大的pair型优先队列constint inf =0x3f3f3f3f;voiddj(){
dis[s]=0;
q.push(make_pair(0, s));//将起点压入qwhile(!q.empty()){//只要还有点没被访问算法就不会结束
u = q.top().second;//取队首编号
q.pop();if(vis[u]){continue;}
vis[u]=1;for(int i =0; i < G[u].size(); i++){int v = G[u][i].x;//v为编号int w = G[u][i].w;//w为权值if(dis[v]> dis[u]+ w){//如果新的解比原来的解大并且这个点没有被访问就进行松弛操作//进行松弛操作,更新最优解
dis[v]= dis[u]+ w;
q.push(make_pair(-dis[v], v));}}}}intmain(){
cin >> n >> m >> s;for(int i =1; i <= n; i++){
dis[i]= inf;}for(int i =1; i <= m; i++){int u, v, w;scanf("%d%d%d",&u,&v,&w);
G[u].push_back(node{w, v});}dj();for(int i =1; i <= n; i++){// if (dis[i] == inf) {// printf("2147483647 ");// } else {
cout << dis[i]<<" ";// }}return0;}