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;
}