NYOJ973天下第一_最长路判环

来源:互联网 发布:网络新闻稿范文 编辑:程序博客网 时间:2024/05/01 02:40

题目链接

注意:如果可以无限增加真气输出Yes否则输出No

我直接忽略了这一点,以为只要能一直流传就可以了,只要这个图是个强连通图就行了,以为转化率是没用的数据。。。第一次是提交也不提示WC,一直提示的Runtime我也找不到哪里错了。。。

最后看了下同学的才发现我理解错题意了,学到了新知识,用spfa判环,之前只用过判断负权环

判断路环:如果某点的进队次数>该点的入度,则成环

安利一下扩展知识:点我

#include<stdio.h>#include<string.h>#include<vector>#include<queue>using namespace std;#define max(a,b) a>b?a:bvector<int>e[505];int in[505];int in_Q[505];int vis[505];double dis[505];double f[505][505];int n; bool spfa(int s){int i,v,u;queue<int>Q;Q.push(s);dis[s]=1;vis[s]=1;in_Q[s]++;while(!Q.empty()){u=Q.front();Q.pop();vis[u]=0;for(i=0;i<e[u].size();i++){v=e[u][i];if(dis[v] < dis[u] * f[u][v])  {  dis[v]=dis[u]*f[u][v];  if(!vis[v])  {  vis[v]=1;Q.push(v);  in_Q[v]++;  if(in_Q[v] > in[v])     return true;    }  }}}return false;}void init(){    memset(in_Q,0,sizeof(in_Q));memset(dis,0,sizeof(dis));memset(vis,0,sizeof(vis));}int main(){int T;scanf("%d",&T);while(T--){int m,i,u,v;double c;scanf("%d%d",&n,&m);for(i=0;i<=n;i++)   e[i].clear();   memset(f,0,sizeof(f));memset(in,0,sizeof(in));for(i=0;i<m;i++){scanf("%d%lf%d",&u,&c,&v);e[u].push_back(v);f[u][v]=max(f[u][v],c);in[v]++;}init();if(spfa(1))   printf("Yes\n");        else           printf("No\n");}return 0;}

错误理解的代码也贴上吧~(判断该图否是强连通)


#include<stdio.h>#include<string.h>#include<vector>#include<stack>using namespace std;#define min(a,b) a<b?a:bint Belong[505];int Bcnt,time;int dfn[505],low[505];int in_s[505];int size_s[505];int n,m;vector<int>e[505];stack<int>S;void init(){memset(Belong,0,sizeof(Belong));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(in_s,0,sizeof(in_s));memset(size_s,0,sizeof(size_s));Bcnt=0;time=0;}void tarjan(int u){int i,v;S.push(u);in_s[u]=1;dfn[u]=low[u]=++time;for(i=0;i<e[u].size();i++){v=e[u][i];if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(in_s[v]){low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){Bcnt++;do{v=S.top();S.pop();in_s[v]=0;Belong[v]=Bcnt;size_s[Bcnt]++;}while(v!=u);}}}int main(){int T;scanf("%d",&T);while(T--){int i,u,v;double f;scanf("%d%d",&n,&m);for(i=0;i<=n;i++)  e[i].clear();  for(i=0;i<m;i++){scanf("%d%lf%d",&u,&f,&v);e[u].push_back(v);}init();for(i=1;i<=n;i++){if(!dfn[i])   tarjan(i);}if(Bcnt==1 && size_s[1]==n){printf("Yes\n");}else  printf("No\n");}return 0;}

明天比赛,给自己加油~

0 0
原创粉丝点击