#include<bits/stdc++.h> using namespace std; vector<int>to[501]; vector<double>w[501]; int n,m,cnt[501]; bool in[501]; double d[501],r; map<string,int>id;//字典(建图用) string x,y; bool spfa(){//SPFA memset(d,0,sizeof(d)); memset(in,0,sizeof(in)); memset(cnt,0,sizeof(cnt)); queue<int>qu; for(int i=0;i<n;i++)qu.push(i),in[i]=cnt[i]=1;//节点全入队,价值初始化为1 while(!qu.empty()){ int f=qu.front(),v;qu.pop();in[f]=0; for(int i=0;i<to[f].size();i++) if(d[v=to[f][i]]<w[f][i]+d[f]){ d[v]=w[f][i]+d[f]; if(!in[v])in[v]=1,cnt[v]++,qu.push(v); if(cnt[v]>n)return 1; } } return 0; }//判环 int main() { for(int shuju=1;;++shuju){ id.clear(); for(int i=0;i<n;++i)to[i].clear(),w[i].clear(); cin>>n;if(!n)return 0; for(int i=0;i<n;i++)cin>>x,id[x]=i; cin>>m; for(int i=0;i<m;i++){ cin>>x>>r>>y; to[id[x]].push_back(id[y]); w[id[x]].push_back(log(r)); }//建图 cout<<"Case "<<shuju<<": "; cout<<(spfa()?"Yes":"No")<<endl; } return 0; }
时间: 2024-04-18 18:32:30 浏览: 72
万能头文件#include“bitsstdc++.h”.docx
这是一个使用SPFA算法判断有向图中是否存在负环的程序。程序首先读入节点数n,然后读入n个节点的名称,并使用一个map将节点名称映射到节点编号。接下来读入边数m,以及每条边的起点、终点和权值。程序会根据输入建立图的邻接表表示,并使用SPFA算法判断是否存在负环。
在每次循环中,程序会清空节点编号映射表和图的邻接表,并重新读入节点数n和节点名称。然后根据输入建立图的邻接表表示,并使用SPFA算法判断是否存在负环。最后输出结果。
运行程序时,可以多次输入不同的有向图,并观察输出结果。
请问还有什么可以帮助您的吗?
阅读全文