sfpa,判定负环的话只需要记录每个点被松弛的次数,如果某个点被松弛了n次,则存在了负环。
poj1502一水
#include<iostream> #include<vector> #include<queue> #include<string.h> #include<cstdlib> using namespace std; const int maxn=100,MAX=10000000; int n,m,beg; // 编号,长度 vector<pair<int,int> >map[maxn+10]; pair<int,int> s; int dis[maxn+10]; bool visit[maxn+10]; queue<int> que; void spfa(int beg) { int i,u; for(i=1;i<=n;i++) dis[i]=MAX; memset(visit,false,sizeof(visit)); dis[beg]=0; while(!que.empty()) que.pop(); que.push(beg); while(!que.empty()) { u=que.front(); que.pop(); for(i=0;i<map[u].size();i++) { if(dis[u]+map[u][i].second<dis[map[u][i].first]) { dis[map[u][i].first]=dis[u]+map[u][i].second; if(!visit[map[u][i].first]) { visit[map[u][i].first]=true; que.push(map[u][i].first); } } } visit[u]=false; } for(i=2;i<=n;i++) if(dis[i]>dis[1]) dis[1]=dis[i]; cout<<dis[1]<<endl; } int main() { int i,j; char str[11]; cin>>n; for(i=1;i<=n;i++) for(j=1;j<i;j++) { cin>>str; if(str[0]!='x') { s.second=atoi(str); s.first=i; map[j].push_back(s); s.first=j; map[i].push_back(s); } } spfa(1); }
dijkstra
#include<iostream> #include<stdlib.h> using namespace std; int map[101][101],n; const int MAX=1000000000; void dijstra(int beg) { int i,j,mini,num; int dis[101]; bool visit[101]; for(i=1;i<=n;i++) { dis[i]=MAX; visit[i]=true; } dis[beg]=0; for(i=1;i<=n;i++) { mini=MAX; for(j=1;j<=n;j++) if(visit[j]&&mini>dis[j]) { mini=dis[j]; num=j; } visit[num]=false; for(j=1;j<=n;j++) if(visit[j]&&dis[j]>dis[num]+map[num][j]) dis[j]=dis[num]+map[num][j]; } num=dis[2]; for(i=3;i<=n;i++) if(dis[i]>num) num=dis[i]; cout<<num<<endl; } int main() { int i,j; char str[11]; cin>>n; for(i=1;i<=n;i++) for(j=1;j<=n;j++) map[i][j]=MAX; for(i=1;i<=n;i++) for(j=1;j<i;j++) { cin>>str; if(str[0]!='x') map[i][j]=map[j][i]=atoi(str); } dijstra(1); }
dijkstra优化
#include<iostream> #include<vector> #include<queue> #include<string.h> #include<cstdlib> using namespace std; const int maxn=100,MAX=10000000; int n,m,beg; // 长度,编号 vector<pair<int,int> >map[maxn+10]; pair<int,int> s,p; int dis[maxn+10]; bool visit[maxn+10]; priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > que; void dijkstra(int beg) { int i; for(i=1;i<=n;i++) dis[i]=MAX; memset(visit,true,sizeof(visit)); dis[beg]=0; while(!que.empty()) que.pop(); s.first=0; s.second=beg; que.push(s); while(!que.empty()) { s=que.top(); que.pop(); if(!visit[s.second]) continue; visit[s.second]=false; for(i=0;i<map[s.second].size();i++) if(dis[s.second]+map[s.second][i].first<dis[map[s.second][i].second]) { dis[map[s.second][i].second]=dis[s.second]+map[s.second][i].first; p.first=dis[map[s.second][i].second]; p.second=map[s.second][i].second; que.push(p); } } for(i=2;i<=n;i++) if(dis[i]>dis[1]) dis[1]=dis[i]; cout<<dis[1]<<endl; } int main() { int i,j; char str[11]; cin>>n; for(i=1;i<=n;i++) for(j=1;j<i;j++) { cin>>str; if(str[0]!='x') { s.first=atoi(str); s.second=i; map[j].push_back(s); s.second=j; map[i].push_back(s); } } dijkstra(1); }