AC_Grazy一直对江湖羡慕不已,向往着大碗吃肉大碗喝酒的豪情,但是“人在江湖漂,怎能
不挨刀",”人在江湖身不由己",如果自己的武功太差,在江湖会死的很惨,但是AC_Grazy没有
武功秘籍练不了绝世武功.有道是“山重水复疑无路,柳暗花明又一村”,在AC_Grazy家里面
竟然藏着一本书,书名竟然叫做【超级外挂】,竟然能在各种武功之间进行转化,据说是他爷
爷的爷爷的...爷爷传下来的...
闲着无事便拿来看看,只看一眼便再也停不下了,只见上面写着“纵横武林打遍天下无敌手武功心法秘籍收录”.
翻开第一篇一看竟然是【降龙十八掌】...
心法只是一个修练武功的途径,重要的是真气的多少,于是他便想利用外挂让武功之间进行转
化,来让真气无限增加,但是这个心法只能按照顺序转化,我们分别用 1号和2号来代替两种功法 当然转化会有一定的转化率f
比如1 0.5 2 便是把 1的一半真气转化给2 ,为了简化问题,我们每次都从1号秘籍开始进行转化,如果其中一个秘籍转化断了,那么以后的功法就不能转换。
2 3 3 1 2 2 2 2 3 3 2 1 4 3 1 2 2 3 2 4 4 2 3
Yes No
超时了两次
也发现自己的毛病 看到了图论题就想深搜 却不知 深搜那么耗时 容易超时
这是我第一次用深搜做的 肯定超时了。。
#include <stdio.h> #include <algorithm> #include <string.h> #include <vector> using namespace std; double map[505][505]; int n,m,t; bool flag,vis[505][505]; vector<int>list[505]; void dfs(int pos,double sum) { if(pos==1) ++t; if(t>=2) { if(sum>=1) flag=true; return ; } for(int i=0;i<list[pos].size();i++) { if(!vis[pos][i]) { vis[pos][i]=true; sum=sum*map[pos][list[pos][i]]; dfs(list[pos][i],sum); if(flag) break; sum=sum/map[pos][list[pos][i]]; vis[pos][i]=false; } } } int main() { int ncase; scanf("%d",&ncase); while(ncase--) { memset(map,0,sizeof(map)); memset(list,0,sizeof(list)); memset(vis,false,sizeof(vis)); scanf("%d %d",&n,&m); for(int i=0;i<m;i++) { int a,b; double x; scanf("%d %lf %d",&a,&x,&b); map[a][b]=max(map[a][b],x); list[a].push_back(b); } flag=false; t=0; dfs(1,1); if(flag) printf("Yes\n"); else printf("No\n"); } }
#include <stdio.h> #include <algorithm> #include <string.h> #include <vector> #include <queue> using namespace std; double f[505][505],dist[505];//f为转换率 dist源点到各点的路径 int n,m,sum[505];//n为点的个数,m为边的个数,sum为进队列的次数 bool in[505];//判断是否在队列中 vector<int>list[505];//邻接表 queue<int>s; bool spfa(int pos) { while(!s.empty()) s.pop(); sum[pos]++; in[pos]=true; dist[pos]=1.0; s.push(pos); while(!s.empty()) { pos=s.front(); s.pop(); in[pos]=false; for(int i=0;i<list[pos].size();i++) { int x=list[pos][i]; if(dist[x]<dist[pos]*f[pos][x]) { dist[x]=dist[pos]*f[pos][x]; if(!in[x]) { s.push(x); in[x]=true; if(++sum[x]==n) return true; } } } } return false; } int main() { int ncase; scanf("%d",&ncase); while(ncase--) { memset(f,0,sizeof(f)); memset(list,0,sizeof(list)); memset(in,false,sizeof(in)); memset(sum,0,sizeof(sum)); memset(dist,0,sizeof(dist)); scanf("%d %d",&n,&m); for(int i=0;i<m;i++) { int a,b; double x; scanf("%d %lf %d",&a,&x,&b); f[a][b]=max(f[a][b],x); list[a].push_back(b); } if(spfa(1)) printf("Yes\n"); else printf("No\n"); } }