floyd+并查集90pts求条
查看原帖
floyd+并查集90pts求条
1153308
lxrfrank25楼主2024/10/24 06:50

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=105;
int n,m,d,ans=1e18,start,endd,fa[N],dis[N][N];
set<int> edge[N];

void init(){for(int i=1;i<=n;i++) fa[i]=i;}
int find(int x){return fa[x]==x?x:(fa[x]=find(fa[x]));}
bool family(int x,int y){return find(x)==find(y);}
void merge(int x,int y){if(!family(x,y)) fa[find(x)]=find(y);}

signed main()
{
    cin>>n>>m;
    init();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            {dis[i][j]=1e18;if(i==j) dis[i][j]=0;}
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        dis[x][y]=min(dis[x][y],z);
        dis[y][x]=min(dis[y][x],z);
        edge[x].insert(y);
        edge[y].insert(x);
    }
    cin>>d;
    for(int i=1;i<=d;i++)
    {
        int x,y;
        cin>>x>>y;
        edge[x].erase(y);
        edge[y].erase(x);
    }
    for(int i=1;i<=n;i++)
        for(auto u:edge[i])
            merge(i,u);
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    cin>>start>>endd;
    for(int i=1;i<=n;i++)
        if(find(i)==find(start))
            for(int j=1;j<=n;j++)
                if(find(j)==find(endd))
                    ans=min(ans,dis[i][j]);
    cout<<ans;
    return 0;
}
2024/10/24 06:50
加载中...