描述
他们飘呀飘,飘呀飘,飘呀飘,飘呀飘~~~
经过七七八十一天的漂泊,残雪、夏夜和水手2011,终于到达了无尽的深渊--lcyz岛,正当他们准备从后门登陆时,突然半路杀出了一个程咬金--一个身高十二尺,腰围380的怪物。这正是传说中lcyz岛上的上古怪物,通道守护者,但是我们都叫他门卫。根据上古传说,只有拿到岛上的上古兵器毛剑,才可打败门卫。有了毛剑,神马都是浮云、、、
毛剑被珍藏在一个灰常隐秘的地下室里,残雪经过重重险阻,终于进入了剑冢,此时毛剑静静地插在一块由纯金打造的纯金上。残雪看见此景,不由感叹一声,好剑啊。又大喊一声:看我剑人合一。说罢,便伸手欲抽剑,但是,一个迷宫瞬间弹了出来(别问我怎么弹出来的-。-),这个迷宫情况如下:
迷宫中有n块区域,其中m条道路,如果从a区域到b区域存在一条道路的话,残雪要想通过这条道路,需要耗费一定的体力值,但是,某些道路上摆放着食物,残雪经过这些道路,可以补充一定的体力值,可以理解为权值为负的道路,现在残雪还要留着体力去打败门岗,需要用最小的体力值拿到毛剑,现在就请你帮助他们取出毛剑。残雪所处的位置在1区域,毛剑所处的位置在n区域。
经过七七八十一天的漂泊,残雪、夏夜和水手2011,终于到达了无尽的深渊--lcyz岛,正当他们准备从后门登陆时,突然半路杀出了一个程咬金--一个身高十二尺,腰围380的怪物。这正是传说中lcyz岛上的上古怪物,通道守护者,但是我们都叫他门卫。根据上古传说,只有拿到岛上的上古兵器毛剑,才可打败门卫。有了毛剑,神马都是浮云、、、
毛剑被珍藏在一个灰常隐秘的地下室里,残雪经过重重险阻,终于进入了剑冢,此时毛剑静静地插在一块由纯金打造的纯金上。残雪看见此景,不由感叹一声,好剑啊。又大喊一声:看我剑人合一。说罢,便伸手欲抽剑,但是,一个迷宫瞬间弹了出来(别问我怎么弹出来的-。-),这个迷宫情况如下:
迷宫中有n块区域,其中m条道路,如果从a区域到b区域存在一条道路的话,残雪要想通过这条道路,需要耗费一定的体力值,但是,某些道路上摆放着食物,残雪经过这些道路,可以补充一定的体力值,可以理解为权值为负的道路,现在残雪还要留着体力去打败门岗,需要用最小的体力值拿到毛剑,现在就请你帮助他们取出毛剑。残雪所处的位置在1区域,毛剑所处的位置在n区域。
输入格式
第一行:一个n,表示区域数目。
第二行:m,表示存在m条道路。
以下m行:
每行三个数:x、y、z
区域x、y的标号和他们之间耗费的体力值z
第二行:m,表示存在m条道路。
以下m行:
每行三个数:x、y、z
区域x、y的标号和他们之间耗费的体力值z
输出格式
从残雪到毛剑所耗费的最小体力(结果为负则为补充体力)。
测试样例1
输入
3
3
1 2 5
2 3 10
1 3 20
输出
15
备注
对于30%的数据,有n<=1000,m<=2000
对于50%的数据,有n<=5000,m<=10000;
对于100%的数据,有n<=10000,m<=50000;
保证此题所涉及的所有数据都是整数。
对于50%的数据,有n<=5000,m<=10000;
对于100%的数据,有n<=10000,m<=50000;
保证此题所涉及的所有数据都是整数。
题解
裸spfa就能过,单向边数据无负环,如果是双向边要怎么做??请教神犇们
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<queue> 5 #define maxn 10005 6 #define maxm 50005 7 #define inf 1<<29 8 using namespace std; 9 queue<int> q; 10 int ecnt,n,m,dis[maxn],vis[maxn],head[maxn]; 11 struct edge{ 12 int u,v,w,next,f; 13 }E[maxm*2]; 14 void addedge(int u,int v,int w) 15 { 16 E[++ecnt].u=u; 17 E[ecnt].v=v; 18 E[ecnt].w=w; 19 E[ecnt].next=head[u]; 20 head[u]=ecnt; 21 } 22 void spfa() 23 { 24 for(int i=1 ; i<=n ; ++i ) 25 dis[i]=inf; 26 dis[1]=0; 27 vis[1]=1; 28 q.push(1); 29 while(!q.empty()) 30 { 31 int d=q.front();q.pop(); 32 vis[d]=0; 33 for(int i=head[d] ; i ; i=E[i].next ) 34 { 35 int v=E[i].v; 36 int w=E[i].w; 37 if(dis[v]>dis[d]+w) 38 { 39 dis[v]=dis[d]+w; 40 if(!vis[v]) 41 { 42 vis[v]=1; 43 q.push(v); 44 } 45 } 46 } 47 } 48 } 49 int main() 50 { 51 int u,v,w; 52 scanf("%d%d",&n,&m); 53 for(int i=1 ; i<=m ; ++i) 54 { 55 scanf("%d%d%d",&u,&v,&w); 56 addedge(u,v,w); 57 } 58 spfa(); 59 printf("%d",dis[n]); 60 return 0; 61 }