比赛 20160412 评测结果 WAWAAAAAAWWWWEEAEEEW
题目名称 正则表达式 最终得分 40
用户昵称 debug 运行时间 1.698 s
代码语言 C++ 内存使用 100.91 MiB
提交时间 2016-04-12 10:31:41
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
int weizhi[1111111]={};int ans=0;
int shuliang[1111111]={};int low[1111111]={},dfn[1111111]={};int h[1111111]={};
int belong[1111111]={};
struct ff{int x,y,v;}f[1155555]={},f2[1155555]={},e[1111111]={},e2[1111111]={};int top=0,q[1111111]={};
int n,m;bool vis[1111111]={},inq[1111111]={};int v[1111111]={};
int weizhi2[1111111]={},shuliang2[1111111]={};
int ans0=0;int cnt=0;int s,t;
int dis[1111111]={};
void getans()
{
	s=belong[1],t=belong[n];
	q[0]=s;int tou=0,wei=0;
	while(tou<=wei)
	{
		int te=q[tou];
		for(int i=weizhi2[te];i<weizhi2[te+1];i++)
			dis[e2[i].y]=dis[te]+e2[i].v,q[++wei]=e2[i].y;
		tou++;
	}
}
void dfs(int s)
{
	int now=0;
	vis[s]=inq[s]=1;
	low[s]=dfn[s]=++cnt;
	q[++top]=s;
	for(int i=weizhi[s];i<weizhi[s+1];i++)
	{
		if(!vis[e[i].y])
		{
			dfs(e[i].y);
			low[s]=min(low[s],low[e[i].y]);
		}
		else if(inq[e[i].y])
			low[s]=min(low[s],dfn[e[i].y]);
	}
	if(low[s]==dfn[s])
	{
		ans0++;
		while(now!=s)
		{
			now=q[top];top--;
			inq[now]=0;
			belong[now]=ans0;
			v[ans0]++;
		}
	}
}
void ttt()
{
	for(int i=1;i<=n;i++)
		if(!vis[i])
			dfs(i);
}
void rebuild()
{
	cnt=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=weizhi[i];j<weizhi[i+1];j++)
		{
			if(belong[i]!=belong[e[j].y])
				f2[++cnt].x=belong[i],f2[cnt].y=belong[e[j].y],f2[cnt].v=e[j].v,shuliang2[belong[i]]++,h[belong[i]]=cnt;
		}
	}
	for(int i=1;i<=n+1;i++)
		weizhi2[i]=weizhi2[i-1]+shuliang2[i-1];
	for(int i=1;i<=cnt;i++)
		e2[weizhi2[f2[i].x]].y=f2[i].y,e2[weizhi2[f2[i].x]].v=f2[i].v,weizhi2[f2[i].x]++;
	for(int i=n+1;i>0;i--)
		weizhi2[i]=weizhi2[i-1];
}
int main()
{
	freopen("regexp.in","r",stdin);
	freopen("regexp.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].v),shuliang[f[i].x]++;
	for(int i=1;i<=n+1;i++)
		weizhi[i]=weizhi[i-1]+shuliang[i-1];
	for(int i=1;i<=m;i++)
		e[weizhi[f[i].x]].y=f[i].y,e[weizhi[f[i].x]].v=f[i].v,weizhi[f[i].x]++;
	for(int i=n+1;i>0;i--)weizhi[i]=weizhi[i-1];
	ttt();
	rebuild();
	getans();
	printf("%d\n",dis[t]);
}