原先的代码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,就过了,请问我这两个有什么区别吗?