codeforces1307 Cow and Fields

https://codeforces.com/contest/1307/problem/D

最近在家状态太差了不敢打cf,果然补了补这道水题还WA了2发。。。难顶

反向bfs一遍,然后fdis存入set,然后正向dfs,每个状态的下的最优值就是正向已经找到的最大的dis+1+set中剩下反向最大的fdis

如果某个时刻>=fdis[1],就直接ans=fdis[1],因为本身的最短路肯定是存在的。

#include
using namespace std;

const int maxl=2e5+10;

int n,m,k,cnt,ans,res,mx,mxf;
int a[maxl],ehead[maxl],dis[maxl],fdis[maxl];
struct ed
{
	int to,nxt;
}e[maxl<<1];
bool vis[maxl],kk[maxl];
queue q;
typedef pair p;
set 

s; inline void add(int u,int v) { e[++cnt].to=v;e[cnt].nxt=ehead[u];ehead[u]=cnt; } inline void prework() { int u,v; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=k;i++) { scanf("%d",&a[i]); kk[a[i]]=true; } for(int i=1;i<=m;i++) { scanf("%d%d",&u,&v); add(u,v);add(v,u); } } inline void mainwork() { int u,v; memset(fdis,-1,sizeof(fdis)); fdis[n]=0;q.push(n); while(!q.empty()) { u=q.front();q.pop(); for(int i=ehead[u];i;i=e[i].nxt) { v=e[i].to; if(fdis[v]<0) { fdis[v]=fdis[u]+1; q.push(v); } } } for(int i=1;i<=k;i++) s.insert(make_pair(fdis[a[i]],a[i])); dis[1]=0;q.push(1);vis[1]=true; if(kk[1]) { s.erase(s.find(make_pair(fdis[1],1))); if((*s.rbegin()).first+1>=fdis[1]) { ans=fdis[1]; return; } ans=(*s.rbegin()).first+1;mx=0; } while(!q.empty()) { u=q.front();q.pop(); for(int i=ehead[u];i;i=e[i].nxt) { v=e[i].to; if(!vis[v]) { dis[v]=dis[u]+1; vis[v]=true; if(kk[v]) { mx=max(dis[v],mx); s.erase(s.find(make_pair(fdis[v],v))); if(s.begin()==s.end()) return; ans=max((*s.rbegin()).first+mx+1,ans); if(ans>=fdis[1]) { ans=fdis[1]; return; } } q.push(v); } } } } inline void print() { printf("%d",ans); } int main() { prework(); mainwork(); print(); return 0; }

 

你可能感兴趣的:(bfs)