题意:
给出一个点数
n≤1000
边数
m≤20000
的有向图,一共
Q≤20000
次询问,询问相互独立,每次询问如果将第
x(1≤x≤m)
条边变为无向边时,图中最大的强连通分量所包含的点数为多少
分析:
先缩点,如果加的边(a,b)本来就在同一个强连通内,那么答案就是原图的答案,
否则枚举a,b能到达的边,把他们所在的强连通累加就是答案
ACcode:
#include <bits/stdc++.h>
#define maxm 20010
#define maxn 1010
using namespace std;
struct N{int to,next;}my[maxm];
int head[maxn],tot;
inline void init(){memset(head,-1,sizeof(head));tot=0;}
inline void add(int u,int v){my[tot].to=v;my[tot].next=head[u];head[u]=tot++;}
int sta[maxn],dfn[maxn],num[maxn],belong[maxn],low[maxn];
int scc,top,n,m,q,Index,maxx,ans;
bool insta[maxn],has[maxn][maxn],vis[maxn];
void tarjan(int u){
int v;
low[u]=dfn[u]=++Index;
sta[top++]=u;
insta[u]=1;
for(int i=head[u];i!=-1;i=my[i].next){
v=my[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=low[u]>low[v]?low[v]:low[u];
}
else if(insta[v]&&low[u]>dfn[v])
low[u]=dfn[v];
}
if(low[u]==dfn[u]){
scc++;
do{
v=sta[--top];
insta[v]=false;
belong[v]=scc;
num[scc]++;
}
while(v!=u);
}
}
struct Q{
int u,v;
void in(){
scanf("%d%d",&u,&v);
add(u,v);
}
}dp[maxm];
inline void slove(){
memset(dfn,0,sizeof(dfn));
memset(insta,false,sizeof(insta));
memset(num,0,sizeof(num));
Index=scc=top=maxx=0;
for(int i=1;i<=n;++i)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=scc;++i)maxx=maxx>num[i]?maxx:num[i];
}
inline void bfs(int x){
queue<int>q;
vis[x]=true;
q.push(x);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i!=-1;i=my[i].next){
int v=my[i].to;
if(!vis[v]){
vis[v]=true;
has[x][v]=true;
q.push(v);
}
}
}
}
int main(){
int loop;
cin>>loop;
while(loop--){
init();
cin>>n>>m>>q;
for(int i=1;i<=m;++i)dp[i].in();
memset(has,0,sizeof(has));
for(int i=1;i<=n;++i){
memset(vis,false,sizeof(vis));
bfs(i);
}
slove();
for(int i=1;i<=q;++i){
int id;
cin>>id;
int u=dp[id].u;
int v=dp[id].v;
if(belong[u]==belong[v])
cout<<maxx<<'\12';
else{
int tmp=num[belong[u]]+num[belong[v]];
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++){
if (belong[i]==belong[u]||belong[i]==belong[v])continue;
if(has[u][i]&&has[i][v]&&!vis[belong[i]]){
tmp+=num[belong[i]];
vis[belong[i]]=true;
}
}
cout<<max(maxx,tmp)<<'\12';
}
}
}
return 0;
}