POJ 3259Wormholes

来源:互联网 发布:javascript有用吗 编辑:程序博客网 时间:2024/06/03 06:15

题意:名字很高端的题,虫洞,给定两点直接进行跳跃,问能否回到从某点出发之前的时间,也就是说构成一个回路,形成负环即可,所以说能否构成负环就成为这题的解法,也就是判断负环;

#include<iostream>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<queue>#include<cstring>#include<cstdio>#define INF 0x3f3f3f3fusing namespace std;int vulue[505][505];int dis[505];bool vis[505];int ci[505];int main(){int f;scanf("%d",&f);for(int i=1;i<=f;i++){int n,m,w;memset(vulue,INF,sizeof(vulue));scanf("%d %d %d",&n,&m,&w);int a,b,c;for(int i=1;i<=m;i++){scanf("%d %d %d",&a,&b,&c);if(vulue[a][b]!=INF){vulue[a][b]=min(vulue[a][b],c);vulue[b][a]=min(vulue[b][a],c);}else{vulue[a][b]=c;vulue[b][a]=c;}}for(int i=1;i<=w;i++){scanf("%d %d %d",&a,&b,&c);vulue[a][b]=(-c);}memset(vis,0,sizeof(vis));memset(dis,INF,sizeof(dis));memset(ci,0,sizeof(ci));queue<int>que;que.push(1);dis[1]=0;ci[1]++;vis[1]=1;int flag=0;while(!que.empty()){int u=que.front();que.pop();vis[u]=0;//cout<<u<<endl;for(int j=1;j<=n;j++){if(dis[j]>dis[u]+vulue[u][j]){dis[j]=dis[u]+vulue[u][j];if(vis[j]==0){vis[j]=1;ci[j]++;que.push(j);if(ci[j]>n){flag=1;break;}}}}if(flag==1){break;}}if(flag==1)  printf("YES\n");else printf("NO\n");}return 0;}


原创粉丝点击