#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <bitset> #include <vector> #include <string> #include <deque> #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const int maxn=2005; #define inf 0x7ffffffF int dis[maxn]; struct Edge { int u,v,cost; Edge(){}; Edge(int u,int v,int cost):u(u),v(v),cost(cost){} }; vector<Edge>e; vector<int>ee[maxn]; int vis[maxn]; int dfs(int u) { if(u==0) return 1; vis[u]=1; for(int i=0;i<ee[u].size();i++) { if(!vis[ee[u][i]]) if(dfs(ee[u][i])) return 1; } return 0; } bool bmf(int s,int n) { for(int i=0;i<n;i++) dis[i]=0; dis[s]=0; for(int i=1;i<n;i++) { int flag=0; for(int j=0;j<e.size();j++) { int u=e[j].u,v=e[j].v; int cost=e[j].cost; if(dis[v]>dis[u]+cost) { dis[v]=dis[u]+cost; flag=true; } } if(!flag) return true; } for(int j=0;j<e.size();j++) { memset(vis,0,sizeof(vis)); if(dfs(e[j].v)&&dis[e[j].v]>dis[e[j].u]+e[j].cost) return false; } return true; } int main() { int kase=0; int t;cin>>t; while(t--) { e.clear(); int n,m; cin>>n>>m; for(int i=0;i<n;i++) ee[i].clear(); while(m--) { int u,v,cost; cin>>u>>v>>cost; ee[u].push_back(v); e.push_back(Edge(u,v,cost)); } printf("Case #%d: %s\n",++kase, !bmf(0, n) ? "possible" : "not possible"); } return 0; }
判下是否有负环经过0那个点就行了 套模板吧