SRM 615 DIV1 500

TC 都615了。。。时间过的真快啊。

第一次做出500分,心情还是很激动的,虽然看了很久的题解,TC官网上的题解,很详细,但是英语的...我搜了搜,发现一份日语的...好吧,我还是看看英语的吧...

这题算法就是二维spfa啊,很容易看出,存在一个环mod,那么D+x*mod = T 这样话,就合法了。就可以用dis[d][u] u表示点,距离 模mod 为d,这样跑一下spfa,只要dis[T%mod][n-1] <= T(小于T的,可以补mod) 说明合法了。 

开始看题解的时候 比较纠结mod怎么取的。。。其实随便取一个mod就行,mod只是为了压缩而已。。

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <string>

 5 #include <vector>

 6 #include <queue>

 7 using namespace std;

 8 #define LL long long

 9 LL dis[20001][51];

10 int in[20001][51];

11 class LongLongTripDiv1

12 {

13     public :

14     string isAble(int N, vector <int> A, vector <int> B, vector <int> D, long long T)

15     {

16         int u,v,d,mod,i;

17         mod = -1;

18         for(i = 0;i < A.size();i ++)

19         {

20             if(A[i] == 0||B[i] == 0)

21             mod = D[i];

22         }

23         if(mod == -1)

24         return "Impossible";

25         mod = mod*2;

26         memset(dis,0x7f,sizeof(dis));

27         queue< pair<int,int> > que;

28         que.push(make_pair(0,0));

29         dis[0][0] = 0;

30         in[0][0] = 1;

31         while(!que.empty())

32         {

33             pair<int,int> s = que.front();

34             d = s.first;

35             u = s.second;

36             in[d][u] = 0;

37             que.pop();

38             for(i = 0;i < A.size();i ++)

39             {

40                 if(u == A[i])

41                 v = B[i];

42                 else if(u == B[i])

43                 v = A[i];

44                 else continue;

45                 LL temp;

46                 temp = D[i] + dis[d][u];

47                 if(temp < dis[temp%mod][v])

48                 {

49                     dis[temp%mod][v] = temp;

50                     if(!in[temp%mod][v])

51                     {

52                         in[temp%mod][v] = 1;

53                         que.push(make_pair(temp%mod,v));

54                     }

55                 }

56             }

57         }

58         return dis[T%mod][N-1] <= T ? "Possible":"Impossible";

59     }

60 };

 

你可能感兴趣的:(div)