hdu 2437(dfs)
9134 ワード
タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=2437
考え方:ある点に到達したときの経路長mod kの最短経路長を2次元配列で記録するだけで、残数が同じであれば最小値を更新します.dfs暴捜でいい.
View Code
考え方:ある点に到達したときの経路長mod kの最短経路長を2次元配列で記録するだけで、残数が同じであれば最小値を更新します.dfs暴捜でいい.
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<vector>
6 using namespace std;
7 #define MAXN 1111
8 #define inf 1<<30
9
10 struct Edge{
11 int v,w;
12 Edge(int vv,int ww):v(vv),w(ww){};
13 };
14
15 int dist[MAXN][MAXN];// i, mod k j
16 char num[MAXN];
17 int n,m,s,k,min_len,pos;
18
19 vector<vector<Edge> >G;
20
21 void dfs(int u,int len)
22 {
23 if(len%k==0&&num[u]=='P'){
24 if(len<min_len){
25 min_len=len,pos=u;
26 }else if(len==min_len){
27 pos=min(pos,u);
28 }
29 return ;
30 }
31 for(int i=0;i<G[u].size();i++){
32 int v=G[u][i].v,w=G[u][i].w;
33 if(dist[v][(len+w)%k]==-1||dist[v][(len+w)%k]>(len+w)){
34 dist[v][(len+w)%k]=len+w;
35 dfs(v,len+w);
36 }
37 }
38 }
39
40
41 int main()
42 {
43 int _case,u,v,w,t=1;
44 scanf("%d",&_case);
45 while(_case--){
46 scanf("%d%d%d%d",&n,&m,&s,&k);
47 scanf("%s",num+1);
48 G.clear();
49 G.resize(n+2);
50 while(m--){
51 scanf("%d%d%d",&u,&v,&w);
52 G[u].push_back(Edge(v,w));
53 }
54 memset(dist,-1,sizeof(dist));
55 min_len=inf;
56 dfs(s,0);
57 if(min_len==inf){
58 printf("Case %d: -1 -1
",t++);
59 }else
60 printf("Case %d: %d %d
",t++,min_len,pos);
61 }
62 return 0;
63 }
64
65
66
67
68
69
View Code