题目大意是说John从出发点通过一些路径和昆虫洞,最后能返回出发点,并且时间早于出发时间,要求你判断所给的路径和昆虫洞是否能够满足这一要求
其实想明白了以后就是判断是否存在负权回路,我用的Spfa做的
代码:
#include<cstdio> #include<cstring> #include<queue> #include<iostream> using namespace std; const int maxn=5500; int e,n,m,w,head[510],nxt[maxn],cost[maxn],pnt[maxn],dist[510],cnt[510]; queue<int> q; bool vis[510]; void AddEdge(int u,int v,int c) { pnt[e]=v;nxt[e]=head[u];cost[e]=c;head[u]=e++; } bool Spfa(int st) { memset(dist,0x7f,sizeof(dist)); memset(vis,0,sizeof(vis)); memset(cnt,0,sizeof(cnt)); while(!q.empty()) q.pop(); dist[st]=0; vis[st]=1; cnt[st]=1; q.push(st); while(!q.empty()) { int u=q.front(); vis[u]=0; q.pop(); for(int i=head[u];i!=-1;i=nxt[i]) { int v=pnt[i]; if(dist[v]>dist[u]+cost[i]) { dist[v]=dist[u]+cost[i]; if(!vis[v]) { q.push(v); vis[v]=1; if(++cnt[v]>n) return true; } } } } return false; } int main() { int T; scanf("%d",&T); while(T--) { memset(head,-1,sizeof(head)); e=0; scanf("%d%d%d",&n,&m,&w); for(int i=0;i<m;i++) { int u,v,c; scanf("%d%d%d",&u,&v,&c); AddEdge(u,v,c); AddEdge(v,u,c); } for(int i=0;i<w;i++) { int u,v,c; scanf("%d%d%d",&u,&v,&c); AddEdge(u,v,-c); } if(Spfa(1)) printf("YES\n"); else printf("NO\n"); } return 0; }