最短路

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);
}




你可能感兴趣的:(最短路)