hdu 1317 spfa判环求最长路
2017-06-27 14:15
316 查看
一个点入队列次数超过点的总和存在环
#include <stdio.h> #include <stdlib.h> #include<map> #include<algorithm> #include<string.h> #include<string> #include<queue> using namespace std; vector<int>G[300]; int book[300],val[300],dis[300],time[300]; #define inf 0x3f3f3f int spfa(int n) { memset(book,0,sizeof(book)); memset(dis,-inf,sizeof(dis)); memset(time,0,sizeof(time)); dis[1]=100; queue<int>q; q.push(1); book[1]=1; while(!q.empty()) { int f=q.front(); q.pop(); time[f]++; book[f]=0; if(time[f]==n) dis[f]=inf; if(time[f]>n) continue; for(int i=0; i<G[f].size(); i++) { if(dis[G[f][i]]<dis[f]+val[G[f][i]]&&dis[f]+val[G[f][i]]>0) { dis[G[f][i]]=dis[f]+val[G[f][i]]; if(G[f][i]==n) return 1; if(!book[G[f][i]]) { book[G[f][i]]=1; q.push(G[f][i]); } } } } return 0; } int main() { int n; while(~scanf("%d",&n)&&n!=-1) { for(int i=1; i<=n; i++) { //printf("ok"); scanf("%d",&val[i]); int m; scanf("%d",&m); for(int j=0; j<m; j++) { int v; scanf("%d",&v); G[i].push_back(v); } } if(spfa(n)) printf("winnable\n"); else printf("hopeless\n"); for(int i=0;i<=n;i++) G[i].clear(); } }
相关文章推荐
- [HDU 1317]XYZZY[SPFA变形][最长路]
- HDU 1317/POJ 1932 Floyd + Spfa 最长路
- hdu 1317 SPFA+连通判断+最长路
- [HDU 1317]XYZZY[SPFA变形][最长路]
- HDU 1317 XYZZY Floyd判断能否到达+SPFA判断能否形成环及求最长路(好题)
- hdu 6201 transaction transaction transaction (spfa求最长路)
- HDU 1317 POJ 1932 XYZZY 正负环+最长路
- HDU1224 Free DIY Tour(最短路变形,最长路打印路径,spfa)
- HDU - 1317 XYZZY (floyd + 最长路)
- hdu 1317+hdu 1535(SPFA)
- HDU 1317 XYZZY Bellman-Ford求最长路 判断正环
- hdu 1534(差分约束+spfa求最长路)
- HDU 1317 XYZZY (SPFA 找正环 + Floyd 判连通)
- hdu 1317 XYZZY(spfa判环)
- hdu 1317+hdu 1535(SPFA)
- HDU 1317--XYZZY 【spfa判断正环求最长路径 && floyd求传递闭包】
- HDU 1317(Floyd判断连通性+spfa判断正环)
- HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路
- HDU:1317 XYZZY(SPFA处理正环+Flody判断点连通)
- hdu 1534(差分约束+spfa求最长路)