标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4421 Accepted Submission(s): 1252
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <vector> 5 #include <cstring> 6 #include <queue> 7 using namespace std; 8 const int maxn = 105; 9 const int INF = 0x3f3f3f3f; 10 int n; 11 int energy[maxn]; 12 int power[maxn]; //记录到每一点的力量值 13 int cnt[maxn]; //记录访问每一个点的次数 14 bool g[maxn][maxn]; 15 bool reach[maxn][maxn]; 16 void floyd() 17 { 18 for(int k = 1; k<=n; k++) 19 for(int i = 1; i<=n; i++) 20 for(int j = 1; j<=n; j++) 21 if(reach[i][j]||(reach[i][k]&&reach[k][j])) reach[i][j] = true; 22 } 23 bool spfa(int s) 24 { 25 queue<int> q; 26 memset(power,0,sizeof(power)); 27 power[s] = 100; 28 memset(cnt,0,sizeof(power)); 29 q.push(s); 30 while(!q.empty()) 31 { 32 int v = q.front(); 33 q.pop(); 34 cnt[v]++; 35 if(cnt[v]>=n) return reach[v][n]; //有正环 36 for(int i = 1; i<=n; i++) 37 { 38 if(g[v][i]&&power[i]<power[v]+energy[i]&&power[v]+energy[i]>0) 39 { 40 power[i] = power[v]+energy[i]; 41 42 q.push(i); 43 } 44 } 45 } 46 return power[n]>0; 47 48 } 49 void solve() 50 { 51 while(scanf("%d",&n)!=EOF&&n!=-1) 52 { 53 memset(g,false,sizeof(g)); 54 memset(reach,false,sizeof(reach)); 55 for(int i = 1; i<=n; i++) 56 { 57 int k,door; 58 scanf("%d %d",&energy[i],&k); 59 for(int j = 1; j<=k; j++) 60 { 61 scanf("%d",&door); 62 g[i][door] = true; 63 reach[i][door] = true; 64 } 65 } 66 floyd(); 67 if(!reach[1][n]) 68 { 69 printf("hopeless\n"); 70 continue; 71 } 72 if(spfa(1)) 73 { 74 printf("winnable\n"); 75 } 76 else 77 { 78 printf("hopeless\n"); 79 } 80 } 81 } 82 int main() 83 { 84 solve(); 85 return 0; 86 }
标签:
原文地址:http://www.cnblogs.com/littlepear/p/5657362.html