比赛 |
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;
}