analysis
首先要缩点
之后如果不考虑反向走边的话,这题就是一个大水题
但要考虑的话,可以用分层图最短路的思想来解决
code
#include<bits/stdc++.h>
using namespace std;
#define loop(i,start,end) for(int i=start;i<=end;++i)
#define anti_loop(i,start,end) for(register int i=start;i>=end;--i)
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a<b)?a:b)
#define ll long long
#define clean(arry,num) memset(arry,num,sizeof(arry))
template<typename T>void read(T &x){
x=0;char r=getchar();T neg=1;
while(r>'9'||r<'0'){if(r=='-')neg=-1;r=getchar();}
while(r>='0'&&r<='9'){x=(x<<3)+(x<<1)+r-'0';r=getchar();}
x*=neg;
}
int n,m,cnt=0;
const int maxn=1e5+10;
struct node{
int e;
int nxt;
}edge[maxn<<2];
int head[maxn<<2];
inline void addl(int u,int v){
edge[++cnt].e=v;
edge[cnt].nxt=head[u];
head[u]=cnt;
}
int dfn[maxn];
int low[maxn];
int bel[maxn<<2];
int W[maxn<<2];
int sta[maxn];
int top=0;
int col=0;
int nfp=0;
#define insta(a) sta[++top]=a
void tarjan(int u){
low[u]=dfn[u]=++nfp;
insta(u);
for(int i=head[u];i!=-1;i=edge[i].nxt){
int v=edge[i].e;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[v],low[u]);
}else if(!bel[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
bel[u]=++col;
++W[col];
while(sta[top]!=u){
bel[sta[top]]=col;
++W[col];
--top;
}
--top;
}
}
struct road{
int x;
int y;
}line[maxn];
inline bool cmp(road a,road b){
return ((a.x==b.x)?a.y<b.y:a.x<b.x);
}
#define belong(x) x=bel[x]
inline void reset(){
loop(i,1,m){
belong(line[i].x);
belong(line[i].y);
}
sort(line+1,line+1+m,cmp);
clean(head,-1);
cnt=0;
loop(i,1,m){
if(line[i].x!=line[i].y&&(line[i].x!=line[i-1].x||line[i].y!=line[i-1].y)){
addl(line[i].x,line[i].y);
addl(line[i].x+col,line[i].y+col);
addl(line[i].y,line[i].x+col);
W[line[i].x+col]=W[line[i].x];
W[line[i].y+col]=W[line[i].y];
}
}
}
int dis[maxn<<2];
int S;
int p[maxn<<2];
void spfa(){
clean(dis,0);
deque<int>q;
q.push_back(S);
dis[S]=W[S];
while(q.empty()==false){
int f=q.front();
q.pop_front();
for(int i=head[f];i!=-1;i=edge[i].nxt){
int v=edge[i].e;
if(dis[v]<dis[f]+W[v]){
dis[v]=dis[f]+W[v];
p[v]=f;
if(!q.empty()&&dis[v]>dis[q.front()])
q.push_front(v);
else q.push_back(v);
}
}
}
printf("%d\n",dis[S+col]-W[S]);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("datain.txt","r",stdin);
#endif
clean(head,-1);
clean(bel,0);
clean(W,0);
clean(sta,0);
clean(low,0);
clean(dfn,0);
read(n);
read(m);
loop(i,1,m){
read(line[i].x);
read(line[i].y);
addl(line[i].x,line[i].y);
}
loop(i,1,n)
if(!dfn[i])
tarjan(i);
reset();
S=bel[1];
spfa();
int _p=S+col;
return 0;
}