求第6个数据
查看原帖
求第6个数据
513717
Str_ywr楼主2022/10/13 08:03

或者那位好心人能帮我看看代码QAQ

//t6:2147483646,应为 9。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e4+5;
const int maxm=2e5+5; 
const int inf=0x7fffffff-1;
int n,m,k,c;
map<pair<int,int>,bool > mp;
struct Edge{
    int v,next,w;
}edge[maxm<<1];
int cnt,head[maxn],vis[maxn],dis[25][maxn],f[25][(1<<20)+5],mus[25];
struct cc{
    int v,next;
}g[1000];//判断重边? 
int cnt1,head1[maxn];
void add(int u,int v,int w){
    edge[++cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt;
}
void ad(int u,int v){
    g[++cnt1].v=v;
    g[cnt].next=head1[u];
    head1[u]=cnt1;
}
struct qnode{
    int v,dis;
    friend bool operator < (qnode x,qnode y){
        return x.dis>y.dis;//
    }
};
void dij(int x){
    priority_queue<qnode> q;
    for(int i=1;i<=n;i++) dis[x][i]=inf;
    dis[x][x]=0; 
    q.push((qnode){x,0});
    while(!q.empty()){
        qnode temp=q.top();
        q.pop();
        int u=temp.v;
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=head[u];i;i=edge[i].next){
            int v=edge[i].v;
            if(!vis[v]&&dis[x][v]>dis[x][u]+edge[i].w){
                dis[x][v]=dis[x][u]+edge[i].w;
                q.push((qnode){v,dis[x][v]});
            }
        }
    }

}
bool ok(int x){//是否符合要求 
    int num=2;
    int stan=x;
    while(x){
        if((x&1)==1){
            if((stan|mus[num])!=stan) return false;
        }
        x>>=1;
        num++;
    }
    return true;
}
int sure[25];
int dfs(int x){//通过一棵树从下向上遍历求一下限制条件的状态s 
    if(sure[x]) return mus[x];
    if(head1[x]==0) return 1<<(x-2);
    for(int i=head1[x];i;i=g[i].next){
        int v=g[i].v;
        mus[x]|=dfs(v);
    }
    sure[x]=1;
    return mus[x];
}
int nonin[25];//入度为0的点的编号 
int main(){
    cin>>n>>m>>k;
    int u,v,w;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&u,&v,&w);//lld
        if(mp[make_pair(u,v)]!=1){
            add(u,v,w);
            add(v,u,w); 
        }
        mp[make_pair(u,v)]=1;

    }
    cin>>c;
    int x,y;
    for(int i=1;i<=c;i++){
        scanf("%d%d",&x,&y);
        mus[y]|=(1<<(x-2));
        nonin[x]=1;
        if(mp[make_pair(x,y)]!=1){
            ad(y,x);
        }
        mp[make_pair(x,y)]=1;
    }
    for(int i=2;i<=k+1;i++){
        if(!nonin[i]){
            dfs(i);
        }
    }
    for(int i=1;i<=k+1;i++){
        memset(vis,0,sizeof vis);
        dij(i);
    }
    for(int i=1;i<=k+1;i++){
        for(int j=0;j<=((1<<k)-1);j++){
            f[i][j]=inf;
        }
    }
    for(int i=2;i<=k+1;i++){
        f[i][(1<<(i-2))]=dis[1][i];
    }
    int minn=inf;
    for(int j=1;j<=((1<<k)-1);j++){
        //if((j&mus[i])!=j) continue;//
        if(!ok(j)) continue;
            for(int l=2;l<=k+1;l++){
            //if(j&(1<<(l-2))) continue;//可不加 
            if(f[l][j]==inf) continue;
            for(int i=2;i<=k+1;i++){
                    if(i==l) continue;
                if((mus[i]|j)==j)
                f[i][j|(1<<(i-2))]=min(f[i][j|(1<<(i-2))],f[l][j]+dis[l][i]); 
            }
        }
    }
    for(int i=2;i<=k+1;i++){
        minn=min(minn,f[i][(1<<k)-1]+dis[i][n]);//k
    }
    cout<<minn<<endl;
    return 0;
}
2022/10/13 08:03
加载中...