小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