题意:给出n个房间,初始在房间1有100的能量值,每次进入一个房间,能量值可能增加也可能减小,(是点权,不是边权),问能否到达终点的时候能量值还为正
这题自己写的时候wa--wa--
后来看了题解,还是wa---wa---
题解很详细http://blog.csdn.net/freezhanacmore/article/details/9937327
记录下自己犯的错误吧
首先是floyd函数初始化的时候,直接写在了函数里面,这样是不对的,因为输入值在前,调用函数在后,这样就相当于将之前输入的可能部分改变了(这个改了好久啊-----55555)
还有就是Bellman_ford时,因为是求正环,所以是d[i][j]=-INF(i!=j)
还有就是输入的权值是点权
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 typedef long long LL; 14 const int INF = 10000000000; 15 const int mod=1000000007; 16 const int maxn=110; 17 int en[maxn],d[maxn],w[maxn][maxn]; 18 int n,m,ecnt; 19 20 21 struct Edge{ 22 int u,v; 23 } e[maxn*maxn]; 24 25 void add(int u,int v){ 26 e[++ecnt].u=u; 27 e[ecnt].v=v; 28 } 29 30 void floyd(){ 31 for(int k=1;k<=n;k++) 32 for(int i=1;i<=n;i++) 33 for(int j=1;j<=n;j++) 34 w[i][j]=w[i][j]||(w[i][k]&&w[k][j]); 35 } 36 37 38 int Bellman_ford(){ 39 for(int i=1;i<=n;i++) d[i]=-INF; 40 d[1]=100; 41 42 for(int i=1;i<n;i++){ 43 for(int j=1;j<=ecnt;j++){ 44 int v=e[j].v; 45 int u=e[j].u; 46 if(d[v]<d[u]+en[v]&&d[u]+en[v]>0){ 47 d[v]=d[u]+en[v]; 48 } 49 } 50 } 51 52 for(int j=1;j<=ecnt;j++){ 53 int v=e[j].v; 54 int u=e[j].u; 55 if((d[v]<d[u]+en[v])&&d[u]+en[v]>0) { 56 if(w[v][n]) 57 return 1; 58 } 59 } 60 return d[n]>0; 61 } 62 63 int main(){ 64 int num; 65 while(scanf("%d",&n)!=EOF&&n!=-1){ 66 ecnt=0; 67 68 memset(en,0,sizeof(en)); 69 memset(w,0,sizeof(w)); 70 for(int i=1;i<=n;i++) w[i][i]=1; 71 for(int i=1;i<=n;i++){ 72 scanf("%d %d",&en[i],&num); 73 while(num--){ 74 int u; 75 scanf("%d",&u); 76 w[i][u]=1; 77 add(i,u); 78 } 79 } 80 81 floyd(); 82 if(Bellman_ford()) printf("winnable\n"); 83 else printf("hopeless\n"); 84 } 85 return 0; 86 }
加油啊- go---go--go
时间: 2024-12-05 04:07:05