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