您当前的位置: 首页 > 

minato_yukina

暂无认证

  • 6浏览

    0关注

    135博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

P2002 消息扩散

minato_yukina 发布时间:2022-09-10 16:01:32 ,浏览量:6

在这里插入图片描述 题意:简单缩点,显然答案是执行完Tarjan算法后,新图中入度为0的点的数目 显然,缩点完成后出现的重边不会影响入度为0的点的计算,因为重边只会让 d e g [ v ] deg[v] deg[v]重复地增加,并不会使得 d e g [ v ] = = 0 deg[v]==0 deg[v]==0的数目增加,所以就这样写就可以了

/*
I don't wanna be left behind,Distance was a friend of mine.
Catching breath in a web of lies,I've spent most of my life.
Catching my breath letting it go turning my cheek for the sake of this show
Now that you know this is my life I won't be told what's supposed to be right
Catch my breath no one can hold me back I ain't got time for that.
*/
#include
using namespace std;
const int maxn = 1e6+5;
const int INF = 1e9+7;
typedef long long ll;
typedef pair pii;
#define all(a) (a).begin(), (a).end()
#define pb(a) push_back(a)
vector G[maxn];
int dfn[maxn],low[maxn],dfs_clock=0;int scc[maxn],scc_cnt;
stack S;
void dfs(int u){
	low[u] = dfn[u] = ++dfs_clock;
	S.push(u);
	for(auto v : G[u]){
		if(!dfn[v]){
			dfs(v);
			low[u] = min(low[u],low[v]);
		}
		else if(!scc[v]) low[u] = min(low[u],dfn[v]);//不是cross_edge而是back_edge的情况更新
	}
	if(low[u]==dfn[u]){
		scc_cnt++;
		while(true){
			int x=S.top();S.pop();
			scc[x]=scc_cnt;
			if(x==u) break;
		}
	}
}
//int to[maxn],head[maxn*2],nxt[maxn*2],tot=1;
//void add(int u,int v){
//	to[++tot] = v,nxt[tot] = head[u],head[u] = tot;
//}
int deg[maxn];
int main(){
    ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n>>m;
	vector edge;
	for(int i=1,u,v;i>u>>v;
		G[u].pb(v);
		edge.push_back({u,v});
	}
	for(int i=1;i            
关注
打赏
1663259277
查看更多评论
0.0569s