记录编号 58201 评测结果 AAWAAAAAAW
题目名称 百进制数 最终得分 80
用户昵称 Gravatarfeng 是否通过 未通过
代码语言 C++ 运行时间 0.014 s
提交时间 2013-04-18 11:31:49 内存使用 4.91 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
struct node{
	int nex;
}a[1001];
struct edge{
	int nex,x,y,v;
}e[50001];
int dis[1001];
bool f[1001];
int w[1001];
bool g[1001];
int queue[1000001];
int n,p;
int oud[1001];
int ind[1001];
void add(int x,int y,int v){
	p++;
	e[p].v=v;
	e[p].y=y;
	e[p].nex=a[x].nex;
	a[x].nex=p;
}
void init(){
	freopen("hex.in","r",stdin);
	freopen("hex.out","w",stdout);
	scanf("%d\n",&n);
	memset(g,false,sizeof(g));
	string str;
	for (int i=1;i<=n;i++){
		getline(cin,str);
		int lll=str.size();
		int len=0;
		for (int j=0;j<lll;j++)
			if (str[j]<='9' && str[j]>='0') len++;
		int x;
		if (len%2==0) 
		x=(str[0]-'0')*10+str[1]-'0';
		else x=str[0]-'0';
		int y=str[len-1]-'0'+(str[len-2]-'0')*10;
		if (x!=y)
		add(x,y,len);
		else{
	//		g[y]=true;
			w[y]=len;
		}
		//oud[x]++;
		//ind[y]++;
	}
}	/*
int spfa(int s){
	memset(f,false,sizeof(f));
	memset(dis,0,sizeof(dis));
	f[s]=true;
	//int o=dis[s];
	dis[s]=0;
	int head,tail;
	queue[tail=1]=s;
	head=0;
	while (head<tail){
		int x=queue[++head];
		f[x]=false;
		int t=a[x].nex; 
		while (t){
			if (e[t].v+dis[x]>dis[e[t].y]){
				dis[e[t].y]=e[t].v+dis[x];
				if (!f[e[t].y]){
					queue[++tail]=e[t].y;
					f[e[t].y]=true;
				}
			}
			t=e[t].nex;
		}
	}
	int maxx=0;
	for (int i=0;i<100;i++)
		if (dis[i]>maxx) maxx=dis[i];
	return maxx;
}*/
void dfs(int x){
	f[x]=true;
	int t=a[x].nex;
	while (t){
		ind[e[t].y]++;
		if (!f[e[t].y]){
			dfs(e[t].y);
		}
		t=e[t].nex;
	}
}
int bfs(int s){
	int head,tail;
	memset(dis,0,sizeof(dis));
	queue[tail=1]=s;
	f[s]=true;
	while (head<tail){
		int x=queue[++head];
		int t=a[x].nex;
		while (t){
			int y=e[t].y;
			
			int v=e[t].v+dis[x];
			if (v>dis[y]) dis[y]=v;
			ind[y]--;
			if (ind[y]==0 && !f[y]){
				queue[++tail]=y;
				f[y]=true;
				
			}
			t=e[t].nex;
		}
	}
	int maxx=0;
	for (int i=0;i<100;i++)
		if (dis[i]>maxx) maxx=dis[i];
	return maxx;
}
void work(){
	int tmp;
	int ans=0;
	for (int i=0;i<100;i++){
		if (i==2){
			int o;
			o=1;
		}
		memset(f,false,sizeof(f));
		memset(ind,0,sizeof(ind));
		dfs(i);
		memset(f,false,sizeof(f));
		tmp=bfs(i);
		for (int j=0;j<100;j++)
			if (f[j]) tmp+=w[j];
		//tmp=spfa(i);
		ans=ans<tmp?tmp:ans;
	}
	printf("%d",ans);
}

int main()
{
	init();
	work();
	return 0;
}