洛谷P2169 正则表达式
2016-09-28 15:43
113 查看
题目背景
小Z童鞋一日意外的看到小X写了一个正则表达式的高级程序,这个正则表达式程序仅仅由字符“0”,“1”,“.”和“*”构成,但是他能够匹配出所有在OJ上都AC的程序的核心代码!小Z大为颇感好奇,于是他决定入侵小X的电脑上去获得这个正则表达式的高级程序。
题目描述
在Internet网络中的每台电脑并不是直接一对一连通的,而是某些电脑之间存在单向的网络连接,也就是说存在A到B的连接不一定存在B到A的连接,并且有些连接传输速度很快,有些则很慢,所以不同连接传输所花的时间是有大有小的。另外,如果存在A到B的连接的同时也存在B到A的连接的话,那么A和B实际上处于同一局域网内,可以通过本地传输,这样花费的传输时间为0。
现在小Z告诉你整个网络的构成情况,他希望知道从他的电脑(编号为1),到小X的电脑(编号为n)所需要的最短传输时间。
输入输出格式
输入格式:
第一行两个整数n, m, 表示有n台电脑,m个连接关系。
接下来m行,每行三个整数u,v,w;表示从电脑u到电脑v传输信息的时间为w。
输出格式:
输出文件仅一行为最短传输时间。
输入输出样例
输入样例#1:3 2 1 2 1 2 3 1输出样例#1:
2输入样例#2:
5 5 1 2 1 2 3 6 3 4 1 4 2 1 3 5 2输出样例#2:
3
说明
对于40%的数据,1<=n<=1000, 1<=m<=10000
对于70%的数据,1<=n<=5000, 1<=m<=100000
对于100%的数据,1<=n<=200000, 1<=m<=1000000
tarjan缩点以后,新图上跑SPFA最短路,求1所在点集到n所在点集的最短路即可。 其实并不需要再建一张图,就在原图上调用belone[x]跑SPFA就行。 然而我真的又建了一张新图2333 写tarjan的时候漏掉了inq[u]=1,居然拿了83分,数据太弱了……/*by SilverN*/ #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; const int mxn=1e6+20; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } struct edge{ int v,dis; int nxt; }e[mxn],mp[mxn]; int hd1[mxn],hd2[mxn]; int mct1=0,mct2=1; void add_edge(int u,int v,int dis){ e[++mct1].v=v;e[mct1].nxt=hd1[u];e[mct1].dis=dis;hd1[u]=mct1; return; } void add_edge2(int u,int v,int dis){ mp[++mct2].v=v;mp[mct2].nxt=hd2[u];mp[mct2].dis=dis;hd2[u]=mct2; return; } int n,m; // int dtime=0; int dfn[mxn],low[mxn]; bool inq[mxn]; int st[mxn],top=0; int belone[mxn],cnt=0; void tarjan(int u){ dfn[u]=low[u]=++dtime; inq[u]=1; int i,j; st[++top]=u; for(i=hd1[u];i;i=e[i].nxt){ int v=e[i].v; if(!dfn[v]){ tarjan(v); low[u]=min(low[u],low[v]); } else if(inq[v]){ low[u]=min(low[u],dfn[v]); } } int v=-1; if(dfn[u]==low[u]){ cnt++; do{ v=st[top--]; inq[v]=0; belone[v]=cnt; }while(u!=v); } return; }// int dis[mxn]; queue<int>q; void SPFA(){ memset(inq,0,sizeof inq); memset(dis,0x3f,sizeof dis); q.push(belone[1]); dis[belone[1]]=0; inq[belone[1]]=1; int i,j; while(!q.empty()){ int u=q.front();q.pop(); for(i=hd2[u];i;i=mp[i].nxt){ int v=mp[i].v; if(dis[v]>dis[u]+mp[i].dis){ dis[v]=dis[u]+mp[i].dis; if(!inq[v]){ inq[v]=1; q.push(v); } } } inq[u]=0; } return; } void solve(){ int i,j; for(i=1;i<=n;i++){ for(j=hd1[i];j;j=e[j].nxt){ int v=e[j].v; if(belone[i]==belone[v])continue; add_edge2(belone[i],belone[v],e[j].dis); } } SPFA(); printf("%d\n",dis[belone ]); return; } // int main(){ n=read();m=read(); int i,j; int u,v,d; for(i=1;i<=m;i++){ u=read();v=read();d=read(); add_edge(u,v,d); } for(i=1;i<=n;i++) if(!dfn[i]) tarjan(i); solve(); return 0; }
相关文章推荐
- 洛谷 P2169 正则表达式
- 洛谷 P2169 正则表达式
- 洛谷 P2169 正则表达式
- 【洛谷 P2169】正则表达式 tarjan+最短路
- 洛谷 P2169 正则表达式
- JAVA自动生成正则表达式工具类
- 洛谷1604 B进制星球
- 2013NOIP普级组第四题--车站分级(参考洛谷题解)
- 正则表达式举例(上)
- 洛谷 P1192 台阶问题
- 洛谷P3585 [POI2015]PIE
- 正则表达式
- 矩阵取数游戏_洛谷1005_dp
- 洛谷—— P3807 【模板】卢卡斯定理
- 正则表达式
- 洛谷 P1056 排座椅
- 洛谷P3386 【模板】二分图匹配
- jmeter 技巧 参数 正则表达式
- 洛谷 P1098 字符串的展开
- 洛谷P2580 于是他错误的点名开始了