2014年3月6日 星期四
[HOJ] 99 - 垃圾處理
#include<stdio.h>
#include<string.h>
#include<stack>
#include<vector>
#define N 100005
using namespace std;
struct P{
int v,c;
};
vector<P> edge;
vector<int> sta,s[N],ans,tmp;
vector<vector<int> > out;
int in[N]{0},vi[N]={0},pp[N]={0},aa[N]={0};
void dfs(int u){
int i,k;
vi[u]=1;
for(;aa[u]<s[u].size();aa[u]++){
i=aa[u];
int v=s[u][i];
if(edge[v].c){
edge[v].c=edge[v^1].c=0;
dfs(edge[v].v);
sta.push_back(edge[v].v);
}
}
}
int main(){
//freopen("smi3a.in","r",stdin);
int i,j,n,m,x,y,a,b,add=0;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++){
scanf("%d%d%d%d",&x,&y,&a,&b);
if(a^b){
s[x].push_back(edge.size());
s[y].push_back(edge.size()+1);
in[x]++;
in[y]++;
edge.push_back((P){y,1});
edge.push_back((P){x,1});
}
}
for(i=1;i<=n;i++){
if(in[i]%2){
puts("NIE");
return 0;
}
}
for(i=1;i<=n;i++){
if(vi[i]==0){
sta.clear();
vi[i]=1;
dfs(i);
sta.push_back(i);
for(j=0;j<sta.size();j++){
//printf("%d ",sta[j]);
if(pp[sta[j]]){
add++;
ans.clear();
ans.push_back(sta[j]);
while(tmp.back()!=sta[j]){
ans.push_back(tmp.back());
pp[tmp.back()]=0;
tmp.pop_back();
}
pp[tmp.back()]=0;
ans.push_back(tmp.back());
tmp.pop_back();
out.push_back(ans);
/*for(x=0;x<ans.size();x++){
printf("%d ",ans[x]);
}puts("");*/
}
tmp.push_back(sta[j]);
pp[sta[j]]=1;
}//puts("");
}
}
printf("%d\n",add);
for(i=0;i<out.size();i++){
ans=out[i];
printf("%d",ans.size()-1);
for(j=0;j<ans.size();j++){
printf(" %d",ans[j]);
}
puts("");
}
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言