Fight Against Traffic过了,但有个问题
查看原帖
Fight Against Traffic过了,但有个问题
555070
Anorak楼主2023/1/19 21:20

Fight Against Traffic

原先的代码WA on #13,现在过了,但有一个问题 WA on #13的代码:

#include <bits/stdc++.h>
using namespace std;
struct node {
	long long u,d;
	bool operator<(const node &a) const {
		return d>a.d;
	}
};
long long n,m,s,t;
vector<long long> adj[10005];
long long dis1[1000005],dis2[1000005];
int vis[100005];
map<long long,map<long long,long long> > edge;
void dijkstra1(long long start)
{
	memset(vis,0,sizeof(vis));
	priority_queue<node> q;
	dis1[start]=0;
	node tmp;
	tmp.u=start;
	tmp.d=0;
	q.push(tmp);
	while(!q.empty()) {
		long long now=q.top().u;
		q.pop();
		if(vis[now]) {
			continue;
		}
		vis[now]=1;
		for(long long i=0; i<adj[now].size(); i++) {
			long long v=adj[now][i];
			if(dis1[v]>dis1[now]+1) {
				dis1[v]=dis1[now]+1;
				tmp.u=v;
				tmp.d=-dis1[v];
				q.push(tmp);
			}
		}
	}
}
void dijkstra2(long long start)
{
	memset(vis,0,sizeof(vis));
	priority_queue<node> q;
	dis2[start]=0;
	node tmp;
	tmp.u=start;
	tmp.d=0;
	q.push(tmp);
	while(!q.empty()) {
		long long now=q.top().u;
		q.pop();
		if(vis[now]) {
			continue;
		}
		vis[now]=1;
		for(long long i=0; i<adj[now].size(); i++) {
			long long v=adj[now][i];
			if(dis2[v]>dis2[now]+1) {
				dis2[v]=dis2[now]+1;
				tmp.u=v;
				tmp.d=-dis2[v];
				q.push(tmp);
			}
		}
	}
}
signed main(void)
{
	ios::sync_with_stdio(false);
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m>>s>>t;
	for(long long i=1; i<=m; i++) {
		long long u,v;
		cin>>u>>v;
		edge[u][v]=1;
		edge[v][u]=1;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	memset(dis1,0x3f,sizeof(dis1));
	dijkstra1(s);
	memset(dis2,0x3f,sizeof(dis2));
	dijkstra2(t);
	long long ans=0;
//	cout << dis1[t]<<" "<<dis2[s]<<"\n";
	for(long long i=1; i<=n-1; i++) {
		for(long long j=i+1; j<=n; j++) {
			if(edge[i][j]) {
				continue;
			}
//			cout << dis1[j]+dis2[i]+1<<" "<<dis1[i]+dis2[j]+1<<"\n";
			if(dis1[j]+dis2[i]+1>=dis1[t]&&dis1[i]+dis2[j]+1>=dis1[t]) {
				ans++;
			}
		}
	}
	cout << ans;
	return 0;
}

这是AC代码:

#include <bits/stdc++.h>
using namespace std;
struct node {
	int u,d;
	bool operator<(const node &a) const {
		return d>a.d;
	}
};
int n,m,s,t;
vector<int> adj[10005];
int dis1[100005],dis2[100005];
int vis[100005];
map<int,map<int,int> > edge;
void dijkstra1(int s)
{
	memset(vis,0,sizeof(vis));
	priority_queue<pair<int,int> > q;
	dis1[s]=0;
	q.push(make_pair(0, s));
	while(!q.empty()) {
		int now=q.top().second;
		q.pop();
		if(vis[now]) {
			continue;
		}
		vis[now]=1;
		for(int i=0; i<adj[now].size(); i++) {
			int nxt=adj[now][i];
			if(dis1[nxt]>dis1[now]+1) {
				dis1[nxt]=dis1[now]+1;
				q.push(make_pair(-dis1[nxt], nxt));
			}
		}
	}
}
void dijkstra2(int s)
{
	memset(vis,0,sizeof(vis));
	priority_queue<pair<int,int> > q;
	dis2[s]=0;
	q.push(make_pair(0, s));
	while(!q.empty()) {
		int now=q.top().second;
		q.pop();
		if(vis[now]) {
			continue;
		}
		vis[now]=1;
		for(int i=0; i<adj[now].size(); i++) {
			int nxt=adj[now][i];
			if(dis2[nxt]>dis2[now]+1) {
				dis2[nxt]=dis2[now]+1;
				q.push(make_pair(-dis2[nxt], nxt));
			}
		}
	}
}
int main(void)
{
	ios::sync_with_stdio(false);
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m>>s>>t;
	for(int i=1; i<=m; i++) {
		int u,v;
		cin>>u>>v;
		edge[u][v]=1;
		edge[v][u]=1;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	memset(dis1,0x3f,sizeof(dis1));
	dijkstra1(s);
	memset(dis2,0x3f,sizeof(dis2));
	dijkstra2(t);
	int ans=0;
//	cout << dis1[t]<<" "<<dis2[s]<<"\n";
	for(int i=1; i<=n-1; i++) {
		for(int j=i+1; j<=n; j++) {
			if(edge[i][j]) {
				continue;
			}	if(dis1[j]+dis2[i]+1>=dis1[t]&&dis1[i]+dis2[j]+1>=dis1[t]) {
				ans++;
			}
		}
	}
	cout << ans;
	return 0;
}

两个都过了样例

我将优先队列的node结构体换成pair,就过了,请问我这两个有什么区别吗?

2023/1/19 21:20
加载中...