#554. 正则表达式

时间:2019-08-21
本文章向大家介绍#554. 正则表达式,主要包括#554. 正则表达式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

【题目描述】:

小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(w≤500)。

【输出描述】:

输出文件仅一行为最短传输时间。

【样例输入】:

5 5
1 2 1
2 3 6
3 4 1
4 2 1
3 5 2

【样例输出】:

3

【时间限制、数据范围及描述】:

时间:1s 空间:256M

对于40%的数据,1<=n<=1000, 1<=m<=10000

对于70%的数据,1<=n<=5000, 1<=m<=100000

对于100%的数据,1<=n<=200000, 1<=m<=1000000

下载

#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<cmath>
#include<stack>
using namespace std;
int n,m;
int head[2000610],k,k2,head2[1000610],belong[1000610],gc,dfn[1000610],t,low[1000610],dis[1000610],vis2[1000610],ins[1000610];
int read(){
	int a=0,b=1;
	char ch=getchar();
	while((ch<48||ch>57)&&ch!='-'){
		ch=getchar();
	}
	if(ch=='-'){
		b=-1;
		ch=getchar();
	}
	while(ch<48||ch>57){
		ch=getchar();
	}
	while(ch>47&&ch<58){
		a=a*10+ch-48;
		ch=getchar();
	}
	return a*b;
}
struct ENode{
	int v,w,next;
}edge[2000610];
struct ENode2{
	int v,w,next;
}edge2[2000610];
void add(int u,int v,int w){
    k++;
	edge[k].v=v;
	edge[k].w=w;
	edge[k].next=head[u];
	head[u]=k;
}
void add2(int u,int v,int w){
	k2++;
	edge2[k2].v=v;
	edge2[k2].w=w;
	edge2[k2].next=head2[u];
	head2[u]=k2;
}
stack<int> sTar;
stack<int> q2;
void Tarjan(int u){
	t++;
	dfn[u]=low[u]=t;
	ins[u]=1;
	sTar.push(u);
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].v;
		if(!dfn[v]){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else{
			if(ins[v]){
			low[u]=min(low[u],dfn[v]);
			}
		}
	}
	if(low[u]>=dfn[u]){
		gc++;
		int i;
		do{
			i=sTar.top();
			ins[i]=0;
			belong[i]=gc;
			sTar.pop();
		}while(i!=u);
	}
}
void spfa(){
	memset(vis2,0,sizeof(vis2));
	memset(dis,0x3f3f3f,sizeof(dis));
	q2.push(belong[1]);
	dis[belong[1]]=0;
	vis2[belong[1]]=1;
	while(q2.size()){
		int h=q2.top();
		q2.pop();
		vis2[h]=0;
		for(int i=head2[h];i;i=edge2[i].next){
			int v=edge2[i].v;
			if(dis[v]>dis[h]+edge2[i].w){
				dis[v]=dis[h]+edge2[i].w;
				if(!vis2[v]){
					q2.push(v);
					vis2[v]=1;
				}
			}
		}
	}
}
int main(){
	int u,v,w;
	n=read(),m=read();
	for(int i=0;i<m;i++){
		u=read(),v=read(),w=read();
		add(u,v,w);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			Tarjan(i);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=edge[j].next){
			int v=edge[j].v;
			if(belong[i]!=belong[v]){
				add2(belong[i],belong[v],edge[j].w);
			}
		}
	}
	spfa();
	printf("%d\n",dis[belong[n]]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/xiongchongwen/p/11391370.html