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