Berland and the Shortest Paths(最短路,dfs)

题目传送门

题意: 给你一张图,在只保留n-1条边的情况下,使得d[1]+d[2]+d[3]+…+d[n]最小,并且输出一个长度为m的01串,如果第i条边保留,输出1,否则输出0,求出k种方案,若方案数不足k,则全输出。

思路: 用vector存合法的边,从1出发,跑一遍dij,假如点v被第i条边松弛得到,先清空e[v],再把v放进去,如果第i条边也可以松弛v,即d[u]+1==d[v],那么这条边也放进v中。最后dfs输出就可以。

#include<bits/stdc++.h>
#define endl '\n'
#define null NULL
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
#define int long long
#define vi vector<int>
#define mii map<int,int>
#define pii pair<int,int>
#define ull unsigned long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read(){
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;}
using namespace std;
const int N=2e5+5;
const int inf=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-6;
int head[N<<1],nxt[N<<1],to[N<<1],num[N<<1],tot=0,n,m,k;
void add(int u,int v,int i)
{
    nxt[++tot]=head[u];
    to[tot]=v;
    num[tot]=i;
    head[u]=tot;
}
vi e[N];int dis[N],vis[N];
void dijkstra(int s)
{
    priority_queue<pii>q;
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;vis[i]=0;
    }
    dis[s]=0;
    q.push(mp(-dis[s],s));
    while(!q.empty())
    {
        int u=q.top().second;
        q.pop();
        if(vis[u])
            continue;
        vis[u]=1;
        for(int i=head[u];i;i=nxt[i])
        {
            int v=to[i];
            if(dis[u]+1<=dis[v])
            {
                if(dis[u]+1==dis[v])
                {
                    e[v].pb(num[i]);
                }
                else
                {
                    dis[v]=dis[u]+1;
                    q.push(mp(-dis[v],v));
                    e[v].clear();
                    e[v].pb(num[i]);
                }
            }
        }
    }
}
int ans[N],tmp[N];
vector<string>v;
void dfs(int d)
{
    if(d==n+1)
    {
        map<int,int>ma;string s;
        for(int i=2;i<=n;i++)
        {
            ma[ans[i]]=1;
        }
        for(int i=1;i<=m;i++)
            if(ma[i]==1)
                s+="1";
            else
                s+="0";
        v.pb(s);
        k--;
        return ;
    }
    for(auto i:e[d])
    {
        ans[d]=i;
        if(k)
            dfs(d+1);
    }
}
signed main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        add(u,v,i);add(v,u,i);
    }
    dijkstra(1);
    dfs(2);
    cout<<v.size()<<endl;
    for(auto i:v)
        cout<<i<<endl;
}
原创文章 144 获赞 13 访问量 8686

猜你喜欢

转载自blog.csdn.net/Joker_He/article/details/105798561
今日推荐