您的位置:首页 > 其它

天下第一 973 (SPFA模板求生成环 好题)

2015-09-18 22:34 351 查看

天下第一

时间限制:1000 ms  |           内存限制:65535 KB难度:3描述AC_Grazy一直对江湖羡慕不已,向往着大碗吃肉大碗喝酒的豪情,但是“人在江湖漂,怎能不挨刀",”人在江湖身不由己",如果自己的武功太差,在江湖会死的很惨,但是AC_Grazy没有武功秘籍练不了绝世武功.有道是“山重水复疑无路,柳暗花明又一村”,在AC_Grazy家里面竟然藏着一本书,书名竟然叫做【超级外挂】,竟然能在各种武功之间进行转化,据说是他爷爷的爷爷的...爷爷传下来的...闲着无事便拿来看看,只看一眼便再也停不下了,只见上面写着“纵横武林打遍天下无敌手武功心法秘籍收录”.翻开第一篇一看竟然是【降龙十八掌】...心法只是一个修练武功的途径,重要的是真气的多少,于是他便想利用外挂让武功之间进行转化,来让真气无限增加,但是这个心法只能按照顺序转化,我们分别用 1号和2号来代替两种功法 当然转化会有一定的转化率f比如1 0.5 2 便是把 1的一半真气转化给2 ,为了简化问题,我们每次都从1号秘籍开始进行转化,如果其中一个秘籍转化断了,那么以后的功法就不能转换。输入输入:首先输入一个数 T(T<=20)表示T组数据然后输入两个数n(2<=n<=500)和m(1=<m<=2000)分别表示有n种秘籍,随后的m行分别输入秘籍u(n>=u>0) 转化率 f (0<f<=10)秘籍 v.(0<v<=n)输出输出:如果可以无限增加真气输出Yes否则输出No.样例输入
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<queue>
#include<string.h>
using namespace std;
struct step
{
int b,next;
double w;
}body[2002];
int head[1002];
double divs[1002];
int vis[1002];
int cnt[1002];
int n;
int spfa()
{
queue <int> q;
q.push(1);
vis[1]=1;
divs[1]=1;
cnt[1]++;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u]; i!=-1; i=body[i].next)
{
int v=body[i].b;
if(divs[u]*body[i].w>divs[v])
{
divs[v]=divs[u]*body[i].w;
if(!vis[v])
{
vis[v]=1;
q.push(v);
cnt[v]++;
if(cnt[v]>=n)
{
return 1;
}
}
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
memset(divs,0,sizeof(divs));
memset(body,0,sizeof(body));
memset(head,-1,sizeof(head));
int m;int z=0;
scanf("%d%d",&n,&m);
for(int i=0; i<m; i++)
{
int a,b;
double f;
scanf("%d%lf%d",&a,&f,&b);
{
body[z].b=b;
body[z].w=f;
body[z].next=head[a];
head[a]=z++;
}
}
int key=spfa();
if(key)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
//这个一直WA,不知为啥。
#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define INF 0x3f3f3f3f#define MIN(a,b) a>b?b:a#define MAX(a,b) a>b?a:busing namespace std;int used[1010],vis[1010];double dis[1010];struct Edge{double val;int to,next;}edge[2010];int head[1010],edgenum;int n,m;int SPFA(int x){queue<int>q;q.push(x);dis[x]=1;vis[x]=1;used[x]++;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(dis[v]<dis[u]*edge[i].val){dis[v]=dis[u]*edge[i].val;if(!vis[v]){vis[v]=1;q.push(v);used[v]++;if(used[v]>=n){return 1;}}}}}return 0;}int main(){int t;scanf("%d",&t);while(t--){memset(vis,0,sizeof(vis));memset(dis,0,sizeof(dis));memset(used,0,sizeof(used));memset(head,-1,sizeof(head));edgenum=0;scanf("%d%d",&n,&m);while(m--){int a,c;double b;scanf("%d%lf%d",&a,&b,&c);{//add(a,b,c);edge[edgenum].to=c;edge[edgenum].val=b;edge[edgenum].next=head[a];head[a]=edgenum++;}}int key=SPFA(1);if(key)printf("YES\n");elseprintf("NO\n");}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: