地址:
点击打开链接
这个题目主要是在缩点完成后的每个分量中,加边成为连通图。
注意这里是取入度与出度的max。可以自己思考一下。入度为0的点与出度为0的点连在一起。
#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 20005
#define Max 0x7fffffff
vector<int >mp[maxn]; // 记录每个结点所连接的结点
int stack[maxn*3]; //用于记录访问过的节点
int vis[maxn]; //dfs用,同时tarjan也用,用来记录访问
int low[maxn]; //记录low,这个不明白的话,就得去看tarjan缩点
int dfn[maxn]; //同上
int color[maxn]; //染色,也就是同样的环内颜色是一致的。
int bills[maxn];
int in[maxn];
int out[maxn];
int needNum,needBill;
int temp[maxn];
int n,m,cnt,tt,sig,leijia;
int in_temp,out_temp ;
//主要用于缩点,说染色可能更加形象一些。
void Tarjan(int u)
{
vis[u]=1; //将该点设置为已经访问
low[u]=dfn[u]=cnt++; //初始化low和dfn , cnt就是每当一个点是新的,那么就cnt++,累加赋值
stack[++tt]=u; //将该点压栈,用数组进行模拟
//查看该点所连接的所有点
for(int i=0;i<mp[u].size();i++)
{
int v=mp[u][i]; //找到该点
if(vis[v]==0)Tarjan(v); //如果该点没有被访问过,那么就访问该点
if(vis[v]==1)low[u]=min(low[u],low[v]); //如果访问过,那么就更新u点的值,这个地方也是tarjan缩点的规则
}
if(low[u]==dfn[u]) //如果构成了一个连通分量
{
sig++; //给这个分量分配一个索引
do
{
vis[stack[tt]]=-1; //将该点的访问归位,这个的作用???
color[stack[tt]]=sig;
}
while(stack[tt--]!=u); //将这个分量内所有的点全都赋值为该索引,如果用染色,那么就是把这个连通分量都染成一样的色
}
}
void Slove()
{
tt=-1;sig=0;cnt=1; //重置染色
for(int i=1;i<=n;i++)
{
if(vis[i]==0)Tarjan(i);
}//Tarjan染色
if(sig==1)
{
printf("0\n");
return ;
}
in_temp= 0 ;
out_temp = 0 ;
memset(in,0,sizeof(in));
memset(out,0 ,sizeof(out));
for(int i = 1 ; i <=n ; i ++ )
{
for(int j = 0 ; j < mp[i].size();j++)
{
int v = mp[i][j];
if(color[i]!=color[v])
{
in[color[v]]++;
out[color[i]]++;
}
}
}
for(int i = 1 ; i <=sig; i ++)//一开始这个地方写成了n,emmm,后面大于sig的都是0,所以会结果错误。看每个节点是不对的,这样会导致多次相加
{
if(in[i]==0)
{
in_temp++ ;
}
if(out[i]==0)
{
out_temp ++;
}
}
printf("%d\n",max(in_temp,out_temp));
}
void init()
{
memset(vis,0,sizeof(vis));
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(color,0,sizeof(color));
}
int main()
{
int T ;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=n;i++)mp[i].clear();
//把每个点连接着谁都赋值
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
mp[x].push_back(y);
}
Slove();
}
}