POJ - 1847 Tram

24 篇文章 0 订阅
6 篇文章 0 订阅

Question Link

题目意思

3 2 1
2 2 3
2 3 1
2 1 2

第一行
从点1 出发,接下来有两个点。2(直接到达)。3,要改变方向才能到。
所以意思就是 1->2 可以直接到达,1->3要改变方向才能到
第二行
从点2 出发,接下来有两个点。3(直接到达)。1,要改变方向才能到。
所以意思就是 2->3 可以直接到达,2->1要改变方向才能到
第三行
从点3 出发,接下来有两个点。1(直接到达)。2,要改变方向才能到。
所以意思就是 3->1 可以直接到达,3->2要改变方向才能到

AC code

Ford algorithm

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std; 
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val)	 memset(var,val,sizeof(var))
#define LL long long 
#define eps 0.000001
#define inf 0x7f7f7f7f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x)   rand()%(x)
#define lowbit(x)   x&(-x)
inline int read()
{
	int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
	while ( a>='0' && a<='9' ){	x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 210
int n,a,b,e[N][N];
int main(){
	rep(i,1,N)	rep(j,1,N)	e[i][j] = 987987987;
	rep(i,1,N)	e[i][i] = 0; 
	scanf("%d%d%d",&n,&a,&b);
	for (int i = 1; i <= n; i++ ){
		int k,v; 
		scanf("%d",&k);
		for (int j = 1; j <= k; j++){
			scanf("%d",&v);
			e[i][v] = j==1 ? 0:1; 
		}
	}
	rep(k,1,n)	rep(i,1,n)	rep(j,1,n)	e[i][j] = min(e[i][j] , e[i][k] + e[k][j]);
	if ( e[a][b] == 987987987 )	e[a][b] = -1; 
	printf("%d\n",e[a][b]);
	return 0; 
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值