有向图的多源多点问题,,,

来源:互联网 发布:海森矩阵 编辑:程序博客网 时间:2024/05/21 17:23
#include<iostream>#include<algorithm>#include<cstdio>#define N  1001#define M 111111111using namespace std;int map[N][N];int n;int main(){  while( ~scanf("%d",&n)!=EOF&&n )       {    for(int i=1;i<=n;++i)          for(int j=1;j<=n;++j)                {if(i!=j) map[i][j]=M;                  else    map[i][j]=0;                }      for(int i=1;i<=n;++i)        {     int m;              ~scanf("%d",&m);              if(!m) continue;              for(int j=1;j<=m;++j)              {  int a,b;                ~scanf("%d%d",&a,&b);                 map[i][a]=b;注意此图为单向图。。。              }          }                for(int k=1;k<=n;++k)                for(int i=1;i<=n;++i)                for(int j=1;j<=n;++j)                 if(map[i][k]!=M&&map[k][j]!=M&&map[i][j]>map[i][k]+map[k][j])                   map[i][j]=map[i][k]+map[k][j];                        int minx=M,k=0;                        for(int i=1;i<=n;++i)分别以每个顶点为源点开始搜索,,,,                          {  int max=0;                             bool flag=false;                            for(int j=1;j<=n;++j)                            {      if(map[i][j]==M)判断该路径是不是连通。                                 {   flag=true;break;}                                    if(map[i][j]>max) max=map[i][j];                           }                           if(!flag&&max<minx)                             minx=max,k=i;                          }                        if(!k) printf("disjoint\n");                        else  printf("%d %d\n",k,minx);                        }return 0;                        }

dijstra算法:

 #include<iostream>#include<string.h>#define  N 1001#define  M 99999999#define  FOR(i,s,t) for(int i=(s);i<=(t);++i)using namespace std;int n;int map[N][N];int dist[N];bool visit[N];int main(){   while(cin>>n,n)     {   memset(map,0,sizeof(map));      FOR(i,1,n)        {   int m;            cin>>m;            if(!m) continue;          FOR(j,1,m)          {  int a,b;             cin>>a>>b;             map[i][a]=b;           }          }            int mmin=M,mink;           FOR(i,1,n)           {     int now=i;                 bool bb=true;                  FOR(j,1,n)               {  dist[j]=M;                  visit[j]=true;               }               dist[now]=0;               visit[now]=false;               FOR(k,1,n)              {      int minx=M;                 FOR(j,1,n)               if(visit[j]&&map[now][j]&&dist[j]>dist[now]+map[now][j])                  dist[j]=dist[now]+map[now][j];                  FOR(j,1,n)                  if(visit[j]&&minx>dist[j])                   minx=dist[now=j];                   visit[now]=false;                  }                  int _max=0;                  FOR(p,1,n)                  if(dist[p]==M)                  {bb=false;break;}                  if(bb)                  {  FOR(p,1,n)                      if(dist[p]>_max) _max=dist[p];                      if(mmin>_max) mmin=_max,mink=i;                  }                                   }                 if(mmin<M&&mmin!=0) cout<<mink<<" "<<mmin<<endl;                   else  cout<<"disjoint"<<endl;                                  } return 0;    }