您的位置:首页 > 其它

洛谷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;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: