求助分析该算法复杂度(已A)
查看原帖
求助分析该算法复杂度(已A)
856459
yangjunhan1楼主2024/12/18 22:51
#include<bits/stdc++.h>
using namespace std;
const int N=205,inf=0x3f3f3f3f;
int n,m,tot,head[N],dis[N][N],pr[N*N*N],cnt;
bool vis[N][N][N],nv[N],flag;
struct qp{
    int to,ne,val;
}e[N*N];
void add(int u,int v,int w){
    e[++tot]={v,head[u],w};
    head[u]=tot;
    dis[u][v]=w;
}
void dfs(int u,int fa,int s,int t){
    if(u==t){
        bool nvis=0;
        for(int i=1;i<=n;i++){
            vis[s][t][i]=vis[s][t][i]&nv[i];
            nvis=nvis|vis[s][t][i];
        }
        if(!nvis)   flag=1;
        return ;
    }
    for(int i=head[u];i;i=e[i].ne){
        int v=e[i].to,w=e[i].val;
        if(v==fa)   continue;
        if(dis[v][t]+w==dis[u][t]){
            nv[v]=1;
            dfs(v,u,s,t);
            nv[v]=0;
            if(flag)    return ;
        }
    }
}
void getans(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(i==j)    continue;
            vis[i][j][i]=vis[i][j][j]=0;
            for(int k=1;k<=n;k++)
                if(vis[i][j][k]){
                    //cout<<i<<" "<<j<<" "<<k<<" "<<dis[i][j]<<endl;
                    pr[++cnt]=k;
                }
        }
}
void prans(){
    sort(pr+1,pr+1+cnt);
    for(int i=1;i<=cnt;i++)
        if(pr[i]!=pr[i-1])  cout<<pr[i]<<" ";
}
int main(){
    memset(dis,inf,sizeof dis);
    cin>>n>>m;
    for(int i=1;i<=n;i++)   dis[i][i]=0;
    while(m--){
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)   vis[i][j][k]=1;
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                if(i==j || i==k || j==k)    continue;
                dis[j][i]=dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
            }
    // for(int i=1;i<=n;i++)
    //     for(int j=1;j<=n;j++)
    //         cout<<i<<" "<<j<<":"<<dis[i][j]<<endl;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(dis[i][j]==inf || i==j)  continue;
            flag=0;
            dfs(i,0,i,j);
        }
    getans();
    prans();
    if(!cnt)    cout<<"No important cities.";
    return 0;
}
//  g++ p1841.cpp -O2 -std=c++14 -Wall -o p1841
2024/12/18 22:51
加载中...