题目传送门
题意: 给你一张图,在只保留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;
}