有向图和无向图判断最小环

有向图:

  • 有向图比较简单,就直接跑一边floyd
    #include <bits/stdc++.h>
    using namespace std;
    #define N 101
    #define INF 0x7ffffff
    int mpt[N][N];
    int m,n;
    void floyd(){
      for(int k=1;k<=n;k++){
          for(int i=1;i<=n;i++)
              for(int j=1;j<=n;j++)
                  if(mpt[i][j]>mpt[i][k]+mpt[k][j])
                      mpt[i][j]=mpt[i][k]+mpt[k][j];
      }
    }
    void init(){
      for(int i=0;i<N;i++)
          for(int j=0;j<N;j++){
              mpt[i][j]=INF;
          }
    }
    int main(){
      int t;
      scanf("%d",&t);
      while(t--){
          scanf("%d%d",&n,&m);
          init();
          int s,e,v;
          for(int i=1;i<=m;i++){
              scanf("%d%d%d",&s,&e,&v);
              if(v<mpt[s][e]){
                  mpt[s][e]=v;
              }
          }
          floyd();
          int min=INF;
          for(int i=1;i<=n;i++){
              if(min>mpt[i][i])
                  min=mpt[i][i];
          }
          if(min<INF)
              printf("%d\n",min);
          else
              printf("-1\n");
      }
      return 0;
    }

无向图

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int _inf = 0x7fffffff;
const int inf = _inf/3;    //程序可能出现3个inf相加
const int maxn = 105;
int graph[maxn][maxn], pre[maxn][maxn], dis[maxn][maxn];
int cnt, path[maxn], sum;
int n, m;
void init()  {
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= n; ++j){
            pre[i][j] = i;
            graph[i][j] = dis[i][j] = inf;
        }
        graph[i][i] = dis[i][i] = 0;
    }
}
void Folyd()
{
    int mins = inf;
    for(int k = 1; k <= n; ++k){
        for(int i = 1; i < k; ++i)
        for(int j = i+1; j < k; ++j){
            int tmp = dis[i][j] + graph[k][i] + graph[j][k];
            if(mins > tmp){
                mins = tmp;
                cnt = 0; sum = 1;
                int t = i;
                while(t != j){
                    path[cnt++] = t;
                    t = pre[j][t];
                }
                path[cnt++] = j;
                path[cnt++] = k;
            }
            else if(tmp == mins) ++sum;
        }
        for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j){
            if(dis[i][j] > dis[i][k]+dis[k][j]){
                dis[i][j] = dis[i][k]+dis[k][j];
                pre[i][j] = pre[k][j];
            }
        }
    }
    if(mins == inf) puts("No solution.");
    else{
        for(int i = cnt-1; i > 0; --i) printf("%d ", path[i]);//输出最小的环的路径
        printf("%d\n", path[0]);
    }
}
int main()
{
    int u, v, w;
    while(~scanf("%d %d", &n, &m))
    {
        init();
        for(int i = 1; i <= m; ++i){
            scanf("%d %d %d", &u, &v, &w);
            if(w < graph[u][v]){
                graph[u][v] = graph[v][u] = w;
                dis[u][v] = dis[v][u] = w;
            }
        }
        Folyd();
    }
    return 0;
}
全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务