| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
5000MS..擦边过了大数写的是最简单的那种
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<stack>
#define N 20010
#define M 2000010
using namespace std;
struct edge
{
int u,v,next;
}elist[M];
int ne; //ne=0 head[N]=-1;
int n,m,k;
int color[M]; // 0 not vis, 1 grey 2 black, in circle
int vis[N];
int head[N];
void addedge(int u,int v)
{
elist[ne].next=head[u], elist[ne].u=u,elist[ne].v=v,head[u]=ne++;
elist[ne].next=head[v], elist[ne].u=v,elist[ne].v=u,head[v]=ne++;
}
int circle[M>>1];
int cnt;
stack<int> S;
void dfs(int u,int f,int ei)
{
vis[u]=1;
// cout<<"v"<<u<<endl;
if(f) S.push(ei);
for(int j=head[u];j!=-1;j=elist[j].next)
if(elist[j].v!=f && color[j]!=2 ){
if(vis[elist[j].v]==1)
{
// cout<<"circle "<<elist[j].v<<endl;
color[j]=color[j^1]=2;
//cout<<elist[j].u<<" "<<elist[j].v<<endl;
int tmp=1;
int le;
int prevu=elist[j].u;
int flag=1;
while(!S.empty())
{
le=S.top();
color[le]=color[le^1]=2;
// cout<<elist[le].u<<" "<<elist[le].v<<endl;
S.pop();
if(prevu==elist[le].v)
prevu=elist[le].u,tmp++;
if(elist[le].u==elist[j].v) break;
}
if(tmp!=0 && prevu != elist[j].v) tmp=0;
circle[cnt++]=tmp;
//cout<<tmp<<endl;
}
else dfs(elist[j].v,u,j);
}
}
class Solution {
public:
string add(string num1,string num2){
if(num1.size()<num2.size()) swap(num1,num2);
int i=num1.size()-1;
int j=num2.size()-1;
int carry=0;
int x,y;
while(j>=0 || i>=0){
if(i>=0)x=num1[i]-'0';
else x=0;
if(j>=0)y=num2[j]-'0';
else y=0;
num1[i]=(x+y+carry)%10+'0';
carry=(x+y+carry)/10;
j--,i--;
}
if(carry) num1="1"+num1;
return num1;
}
string mul(string num,int n,int zeros){
int carry=0;
int j=num.size()-1;
for(;j>=0;j--){
int x=num[j]-'0';
num[j]=((x*n)+carry)%10+'0';
carry=(x*n+carry)/10;
}
if(carry) num=char(carry+'0')+num;
return num.append(zeros,'0');
}
string multiply(string num1, string num2) {
string ans="0";
for(int j=num2.size()-1,zero=0;j>=0;j--,zero++){
ans=add(ans,mul(num1,num2[j]-'0',zero));
}
while(ans.size()>1&&ans[0]=='0') ans=ans.substr(1);
return ans;
}
};
string toString(int num)
{
string s="";
while(num) s+=('0'+(num%10)),num/=10;
string t=s;
int len=s.size();
for(int i=0;i<s.size();i++)
t[i]=s[len-1-i];
return t;
}
int main()
{
ne=0;
int u,v;
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d",&k);
scanf("%d",&u);
for(int i=1;i<k;i++)
{
scanf("%d",&v);
addedge(u,v);
u=v;
}
}
dfs(1,0,0);
for(int i=1;i<=n;i++)
if(!vis[i])
{
printf("0\n");
return 0;
}
for(int i=0;i<cnt;i++)
if(!circle[i]){
printf("0\n");
return 0;
}
Solution s;
string ans="1";
for(int i=0;i<cnt;i++)
//cout<<circle[i]<<endl,
ans=s.multiply(ans,toString(circle[i]+1));
cout<<ans<<endl;
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator