NEFU 657 Reverse a Road(SPFA)
2013-04-20 19:31
323 查看
Reverse a Road | ||
| ||
description | ||
Peter resides in the city of Nanuh, and goes to his working place in this city every weekday.He has been totally annoyed with the road traffic of this city. All the roads in this city are one-way, so he has to drive a longer way than he thinks he need. One day, the following thought has come up to Peter’s mind: “How about making the sign of one road indicate the opposite direction? I think my act won’t be out as long as I change just one sign. Well, of course I want to make my route to the working place shorter as much as possible. Which road should I alter the direction of?” What a clever guy he is. You are asked by Peter to write a program that finds the shortest route when the direction of up to one road is allowed to be altered. You don’t have to worry about the penalty for complicity, because you resides in a different country from Peter and cannot be punished by the law of his country. So just help him! | ||
input | ||
The input consists of a series of datasets, each of which is formatted as follows: N S T M A1 B1 A2 B2 : : : AM BM ,N denotes the number of points. S and T indicate the points where Andrew’s home and working place are located respectively. M denotes the number of roads. Finally, Ai and Bi indicate the starting and ending points of the i-th road respectively. Each point is identified by a unique number from 1 to N. Some roads may start and end at the same point. Also, there may be more than one road connecting the same pair of starting and ending points. You may assume all the following: 1 <= N <= 1000, 1 <= M <= 10000, and S , T. | ||
output | ||
For each dataset, print a line that contains the shortest distance (counted by the number of passed roads) and the road number whose direction should be altered. If there are multiple ways to obtain the shortest distance, choose one with the smallest road number. If no direction change results in a shorter route, print 0 as the road number. Separate the distance and the road number by a single space. No extra characters are allowed. | ||
sample_input | ||
4 1 4 4 1 2 2 3 3 4 4 1 | ||
sample_output | ||
1 4 | ||
hint | ||
source |
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int mm=524010;
const int oo=1e9;
bool vis[mm];
int n,m;
int s,t;
int g[1010][1010],pos;
int head[mm],ver[mm],next[mm],edge,dis[2][mm],q[mm];
class node
{
public:int u,v,edge;
}f[mm];
void data()
{
edge=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
ver[edge]=v;next[edge]=head[u];head[u]=edge++;
}
void spfa(int*dis)
{
for(int i=1;i<=n;++i)
dis[i]=oo,vis[i]=0;
dis[s]=0;
int l=0,r=1,z,v;q[l]=s;vis[s]=1;
while(l^r)
{
z=q[l++];l%=mm;vis[z]=0;
for(int i=head[z];i>=0;i=next[i])
{ v=ver[i];
if(dis[v]>dis[z]+1)
{dis[v]=dis[z]+1;
if(!vis[v])
q[r++]=v,r%=mm,vis[v]=1;
}
}
}
}
int main()
{ int a,b;
while(~scanf("%d",&n))
{
scanf("%d%d%d",&s,&t,&m);
pos=0;
memset(g,0,sizeof(g));
for(int i=0;i<m;++i)
{
scanf("%d%d",&a,&b);if(g[a][b])continue;
f[pos].u=a;f[pos].v=b;f[pos].edge=i+1;pos++;
g[a][b]=1;
}
data();
for(int i=0;i<pos;++i)
{
add(f[i].u,f[i].v);
}
spfa(dis[0]);
/**for(int i=1;i<=n;++i)
cout<<dis[0][i]<<" ";
**/data();s^=t;t^=s;s^=t;
for(int i=0;i<pos;++i)
{
add(f[i].v,f[i].u);
}
spfa(dis[1]);
/** cout<<endl;
for(int i=1;i<=n;++i)
cout<<dis[1][i]<<" ";
cout<<endl;
**/ int ans=oo,z=oo,ret;
for(int i=0;i<pos;++i)
{ ret=dis[0][f[i].v]+dis[1][f[i].u]+1;
if(ans>ret)ans=ret,z=f[i].edge;
else if(ans==ret&&f[i].edge<z)z=f[i].edge;
}
if(ans==oo)cout<<0<<"\n";
else
cout<<ans<<" "<<z<<"\n";
}
}
相关文章推荐
- NEFU 657 Reverse a Road(SPFA)
- bzoj1726 [Usaco2006 Nov]Roadblocks第二短路(spfa)
- poj 3255 Roadblocks(无向图次短路 SPFA)
- 【最短路+dijkstra+floyd+spfa】1596 find the safest road
- hdu-1596 find the safest road(SPFA做法)
- URAL 1980 Road to Investor (二分 + SPFA)
- HDU 1596:find the safest road【Dijkstra & SPFA】
- hdu1596 find the safest road【最短路dijkstra&&SPFA】
- 【次短路径/SPFA】BZOJ1726-[Usaco2006 Nov]Roadblocks第二短路
- 【二分+SPFA】修建道路(road)
- TOJ 3010 Reverse a Road / dijkstra
- [BZOJ4992] [Usaco2017 Feb]Why Did the Cow Cross the Road(spfa)
- [最小割最大流 || 最短路] roadblock Dinic && SPFA + SLE
- 【SPFA】 hdu1596 find the safest road
- POJ 3255-Roadblocks(A*+spfa)
- POJ3255 - Roadblocks - 次短路(spfa+LLL优化)
- NEFU 644 touring compute(SPFA+最短路)
- Reverse a Road 最短路
- 杭电1596find the safest road(spfa)
- NEFU 644 touring compute(SPFA+最短路)