标签:empty spfa push printf 城市 \n dfs cstring color
题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市u到另一个城市v的时间为:(au-av)^3,存在负环。问从第一个城市到达第k个城市所话的时间,如果不能到达,或者时间小于3输出?否则输出所花的时间 .
解析:spfa判断负环 然后dfs标记负环
如果某个在环内 || d[e,v] == INF || d[e.v] < 3 则输出?
否则输出d[e.v]
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <cmath> #include <stack> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn = 209, INF = 0x7fffffff; int head[maxn], d[maxn], vis[maxn*maxn], des[maxn], ans[maxn], cir[maxn]; int dot[maxn]; int n, m, q; struct node{ int u,v,w,next; }Node[maxn*maxn]; void add(int u,int v,int w,int i) { Node[i].u = u; Node[i].v = v; Node[i].w = w; Node[i].next = head[u]; head[u] = i; } void dfs(int u) { cir[u] = 1; for(int i=head[u]; i!=-1; i=Node[i].next) if(!cir[Node[i].v]) dfs(Node[i].v); } void spfa(int s) { queue<int> Q; for(int i=0; i<=n; i++) d[i] = INF; d[s] = 0; mem(vis,0); Q.push(s); vis[s] = 1; while(!Q.empty()) { int x = Q.front(); Q.pop(); vis[x] = 0; for(int i=head[x]; i!=-1; i=Node[i].next) { node e = Node[i]; if(cir[e.v]) continue; //!!!!!!!!!!!呵。。呵。。T了好几发才发现。。。。。 if(d[e.v] > d[x] + e.w) { d[e.v] = d[x] + e.w; if(!vis[e.v]) { Q.push(e.v); vis[e.v] = 1; ans[e.v]++; if(ans[e.v] > n) dfs(e.v); } } } } } int main() { int T; scanf("%d",&T); int cnt = 0; while(T--) { mem(cir,0); mem(ans,0); mem(head,-1); scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&dot[i]); scanf("%d",&m); for(int i=0; i<m; i++) { int u, v; scanf("%d%d",&u,&v); add(u,v,(dot[v]-dot[u])*(dot[v]-dot[u])*(dot[v]-dot[u]),i); } spfa(1); scanf("%d",&q); for(int i=0; i<q; i++) scanf("%d",&des[i]); printf("Case %d:\n",++cnt); for(int i=0; i<q; i++) if( cir[des[i]] || d[des[i]] == INF || d[des[i]] < 3) printf("?\n"); else printf("%d\n",d[des[i]]); } return 0; }
LightOJ - 1074 Extended Traffic(标记负环)
标签:empty spfa push printf 城市 \n dfs cstring color
原文地址:https://www.cnblogs.com/WTSRUVF/p/9162250.html