HDU3749 95pts求助
  • 板块灌水区
  • 楼主cqbzlyf
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/12/17 15:53
  • 上次更新2023/12/17 17:38:38
查看原帖
HDU3749 95pts求助
565256
cqbzlyf楼主2023/12/17 15:53

rt,输出有变(safe为two or more,danger为one,none为zero)

#include<bits/stdc++.h>
using namespace std;
#define MAXN 5005
vector<int> v[MAXN],cp[MAXN];
stack<int> st;
int n,m,q,now,tot;
int dfn[MAXN],low[MAXN],num[MAXN];
void dfs_cp(int x,int z){
	num[x]=z;
	st.push(x);
	dfn[x]=low[x]=++now;
	for(int i=0;i<v[x].size();i++){
		int y=v[x][i];
		if(!dfn[y]){
			dfs_cp(y,z);
			low[x]=min(low[x],low[y]);
			if(low[y]>=dfn[x]){
				tot++;
				while(st.top()!=y){
					cp[st.top()].push_back(tot);
					st.pop();
				}
				cp[y].push_back(tot);
				st.pop();
				cp[x].push_back(tot);
			}
		}else low[x]=min(low[x],dfn[y]);
	}
}
int main(){
	//freopen("crisis.in","r",stdin);
	//freopen("crisis.out","w",stdout);
	cin>>n>>m>>q;
	int tot=1;
	while(n&&m&&q){
		cout<<"Case "<<tot<<":\n";
		tot++;
		int x,y;
		for(int i=1;i<=m;i++){
			cin>>x>>y;
			v[x].push_back(y);
			v[y].push_back(x);
		}
		int t=0;
		for(int i=0;i<n;i++)
			if(!dfn[i])dfs_cp(i,++t);
		while(q--){
			cin>>x>>y;
			bool fl=0;
			for(int i=0;i<cp[x].size();i++){
				for(int j=0;j<cp[y].size();j++){
					if(cp[x][i]==cp[y][j]){
						fl=1;
						break;
					}
				}
			}
			if(fl)cout<<"safe\n";
			else if(num[x]==num[y])cout<<"danger\n";
			else cout<<"none\n";
		}
		cout<<'\n';
		::tot=now=0;
		memset(dfn,0,sizeof dfn);
		memset(low,0,sizeof low);
		memset(num,0,sizeof num);
		for(int i=0;i<n;i++)v[i].clear(),cp[i].clear();
		while(!st.empty())st.pop();
		cin>>n>>m>>q;
	}
	return 0;
}
2023/12/17 15:53
加载中...