求助
  • 板块P1656 炸铁路
  • 楼主XXCCVV
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/28 13:54
  • 上次更新2023/10/23 20:14:57
查看原帖
求助
638832
XXCCVV楼主2023/3/28 13:54
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
using namespace std;

struct edge {
	int next,to,w;
} edges[5005];

struct baga {
	int a1,a2;
} baga_[5005];

int n,m,cnt,endd;
int x[5005],y[5005];
int head[155],vis[5005],ans[5005];

void addEdge(int u,int v,int w) {
	edges[++cnt].w=w;
	edges[cnt].to=v;
	edges[cnt].next=head[u];
	head[u]=cnt;
}

bool cmp(baga l,baga k) {
	if(l.a1>k.a1) {
		return 0;
	} else if(l.a1==k.a1) {
		if(l.a2>k.a2) {
			return 0;
		}
	} else {
		return 1;
	}
}

void dij(int x,int y) {
	memset(ans,0x3f3f3f3f,sizeof(ans));
	priority_queue<pair<int,int>,vector<pair<int,int> > ,greater<pair<int,int> > >que;
	ans[x]=0;
	vis[x]=1;
	que.push(make_pair(0,x));
	while(!que.empty()) {
		int now=que.top().second,diss=que.top().first;
		que.pop();
		vis[now]=0;
		for(int i=head[now]; i!=0; i=edges[i].next) {
			int to=edges[i].to;
			if(now==x&to==y)continue;
			if(ans[to]>diss+edges[i].w) {
				ans[to]=diss+edges[i].w;
				que.push(make_pair(ans[to],to));
			}
		}
	}
}

int main() {
	cin>>n>>m;
	for(int i=1; i<=m; i++) {
		cin>>x[i]>>y[i];
		addEdge(x[i],y[i],1);
		addEdge(y[i],x[i],1);
	}
	for(int i=1; i<=m; i++) {
		dij(x[i],y[i]);
		if(ans[y[i]]==0x3f3f3f3f) {
			endd++;
			baga_[endd].a1=min(x[i],y[i]);
			baga_[endd].a2=max(x[i],y[i]);
		}
	}
	sort(baga_+1,baga_+1+endd,cmp);
	for(int i=1; i<=endd; i++) {
		cout<<baga_[i].a1<<" "<<baga_[i].a2<<endl;
	}
	return 0;
}

有没有大佬可以解释一下dij里面的vis[now]=0(雾

2023/3/28 13:54
加载中...