记录编号 61157 评测结果 AAAAAAAAAA
题目名称 [NOI 2008]假面舞会 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.160 s
提交时间 2013-06-04 20:46:49 内存使用 1.93 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<vector>
#include<queue>
using namespace std;
const int SIZEN=100001,INF=0x7fffffff;
vector<pair<int,int> > c[SIZEN];//邻接表
int n,m;
bool visit[SIZEN]={0};
int f[SIZEN]={0};
int limit=0;
int deepest=0,shallowest=INF;
int treeans=0;
bool circle=false;
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
void DFS(int x,int d){//x的"距离"是d
	if(visit[x]) return;
	visit[x]=true;
	f[x]=d;
	deepest=max(deepest,d);
	shallowest=min(shallowest,d);
	int i,now;
	for(i=0;i<c[x].size();i++){
		now=c[x][i].first;
		if(!visit[now]) DFS(now,d+c[x][i].second);
		else{
			int temp=abs(d+c[x][i].second-f[now]);
			if(temp){
				circle=true;
				limit=gcd(limit,temp);
			}
		}
	}
}
int limited_fac(int x){
	int ans=INF;
	int i;
	int high=(int)sqrt((double)x);
	for(i=1;i<=high;i++){
		if(x%i==0){
			if(i>=3) ans=min(ans,i);
			ans=min(ans,x/i);
		}
	}
	return ans;
}
void traver(void){//遍历整个图
	int i;
	for(i=1;i<=n;i++){
		if(visit[i]) continue;
		deepest=0;
		shallowest=INF;
		DFS(i,0);
		treeans+=(deepest-shallowest+1);
	}
}
void write(void){
	if(!circle){//树结构
		if(treeans<3){//无合法方案
			printf("-1 -1\n");
		}
		else{
			printf("%d ",treeans);
			printf("3\n");
		}
	}
	else{//环结构
		if(limit<3){//无合法方案
			printf("-1 -1\n");
		}
		else{
			printf("%d ",limit);
			printf("%d\n",limited_fac(limit));
		}
	}
}
void read(void){
	scanf("%d%d",&n,&m);
	int i,a,b;
	for(i=1;i<=m;i++){
		scanf("%d%d",&a,&b);//a可见b
		c[a].push_back(make_pair(b,1));
		c[b].push_back(make_pair(a,-1));
	}
}
int main(){
	freopen("party2008.in","r",stdin);
	freopen("party2008.out","w",stdout);
	read();
	traver();
	write();
	return 0;
}