POJ 3259Wormholes
题意:名字很高端的题,虫洞,给定两点直接进行跳跃,问能否回到从某点出发之前的时间,也就是说构成一个回路,形成负环即可,所以说能否构成负环就成为这题的解法,也就是判断负环;
#include<iostream> #include<algorithm> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #include<cstring> #include<cstdio> #define INF 0x3f3f3f3f using 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; }