比赛 20160412 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 正则表达式 最终得分 100
用户昵称 瑆の時間~無盡輪迴·林蔭 运行时间 2.172 s
代码语言 C++ 内存使用 27.39 MiB
提交时间 2020-05-15 08:39:43
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue> 
#include<cstring>
using namespace std;
int dfn[200010],low[200010],vis[200010],ls[200010],far[200010];
int n,m,a1,a2,a3,qlt,cnt,tot,stack[200010];
vector<pair<int,int> > b[200010],c[200010];
void TARJAN(int x)
{
	dfn[x]=low[x]=++tot;
	stack[++cnt]=x;
	vis[x]=1;
	for(int i=0;i<b[x].size();i++)
	{
		int to=b[x][i].first;
		if(!dfn[to])
		{
			TARJAN(to);
			low[x]=min(low[x],low[to]);
		}
		else
		{
			if(vis[to])
			{
				low[x]=min(low[x],dfn[to]);
			}
		}
	} 
	if(low[x]==dfn[x])
	{
		qlt++;
		while(stack[cnt]!=x)
		{
			ls[stack[cnt]]=qlt;
			vis[stack[cnt]]=0;
			cnt--;
		}
		ls[stack[cnt]]=qlt;
		vis[stack[cnt]]=0;
		cnt--;
	}
}
void MakeE()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<b[i].size();j++)
		{
			c[ls[i]].push_back(make_pair(ls[b[i][j].first],b[i][j].second)); 
		}
	}
}
void DIJ() 
{
	memset(vis,0,sizeof(vis));
	memset(far,0x3f3f3f3f,sizeof(far));
	vis[ls[1]]=1;
	far[ls[1]]=0;
	priority_queue<pair<int,int> > q;
	q.push(make_pair(0,ls[1]));
	while(q.size())
	{
		int x=q.top().second;
		q.pop();
		for(int i=0;i<c[x].size();i++)
		{
			int to=c[x][i].first,v=c[x][i].second;
			if(far[x]+v<far[to])
			{
				far[to]=far[x]+v;
				if(!vis[to])
				{
					vis[to]=1;
					q.push(make_pair(-far[to],to));
				}
			}
		}
	}
} 
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",&a1,&a2,&a3);
		b[a1].push_back(make_pair(a2,a3));
	}
	TARJAN(1);
	MakeE();
	DIJ();
	printf("%d",far[ls[n]]);
	return 0;
}