题目描述
给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N。问从顶点11开始,到其他每个点的最短路有几条。
输入输出格式
输入格式:
第一行包含22个正整数N,MN,M,为图的顶点数与边数。
接下来MM行,每行22个正整数x,yx,y,表示有一条顶点xx连向顶点yy的边,请注意可能有自环与重边。
输出格式:
共NN行,每行一个非负整数,第ii行输出从顶点11到顶点ii有多少条不同的最短路,由于答案有可能会很大,你只需要输出ans \bmod 100003ansmod100003后的结果即可。如果无法到达顶点ii则输出00。
#include<bits/stdc++.h>
using namespace std;
struct node{
int u,v;
}mp[4000005];
priority_queue<pair <int,int > >q;
bool pd[1000005];
int f[1000005],ne[4000005],dist[1000005],ans[1000005],n,m,x,y;
int main(){
cin>>n>>m;
for(int i=1;i<=m*2;i+=2){
scanf("%d%d",&mp[i].u,&mp[i].v);
mp[i+1].u=mp[i].v,mp[i+1].v=mp[i].u;
ne[i]=f[mp[i].u];
f[mp[i].u]=i;
ne[i+1]=f[mp[i+1].u];
f[mp[i+1].u]=i+1;
}
for(int i=1;i<=n;i++)
dist[i]=1e9;
dist[1]=0;
ans[1]=1;
q.push(make_pair(0,1));
while(q.size()){
x=q.top().second,q.pop();
if(pd[x])
continue;
pd[x]=true;
for(int i=f[x];i;i=ne[i]){
y=mp[i].v;
if(dist[y]>dist[x]+1){
dist[y]=dist[x]+1;
ans[y]=ans[x];
q.push(make_pair(-dist[y],y));
}
else if(dist[y]==dist[x]+1){
ans[y]+=ans[x];
ans[y]=ans[y]%100003;
}
}
}
for(int i=1;i<=n;i++)
cout<<ans[i]<<endl;
return 0;
}
题目背景
小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。
有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。
题目描述
给你云朵的个数NN,再给你MM个关系,表示哪些云朵可以连在一起。
现在小杉要把所有云朵连成KK个棉花糖,一个棉花糖最少要用掉一朵云,小杉想知道他怎么连,花费的代价最小。
输入输出格式
输入格式:
每组测试数据的
第一行有三个数N,M,K(1 \le N \le 1000,1 \le M \le 10000,1 \le K \le 10)N,M,K(1≤N≤1000,1≤M≤10000,1≤K≤10)
接下来MM个数每行三个数X,Y,LX,Y,L,表示XX云和YY云可以通过LL的代价连在一起。(1 \le X,Y \le N,0 \le L<10000)(1≤X,Y≤N,0≤L<10000)
30\%30%的数据N \le 100,M \le 1000N≤100,M≤1000
输出格式:
对每组数据输出一行,仅有一个整数,表示最小的代价。
如果怎么连都连不出KK个棉花糖,请输出'No Answer'。
#include<bits/stdc++.h>
using namespace std;
int bcj[1005],f[1005],ne[10005],n,m,cost,jsq,ans,num=1;
struct node{
int u,v,w;
}mp[10005];
inline int read(){
int k=0,f=1;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-1;
for(;isdigit(c);c=getchar())
k=k*10+c-'0';
return k*f;
}
inline int fa(int x){
if(x!=bcj[x])
return bcj[x]=fa(bcj[x]);
else
return x;
}
bool cmp(const node &a,const node &b){
return a.w<b.w;
}
int main(){
jsq=n=read();
m=read();
cost=read();
if(n<cost){
cout<<"No Answer";
return 0;
}
if(n==cost){
cout<<0;
return 0;
}
for(int i=1;i<=m;i++){
mp[i].u=read();
mp[i].v=read();
mp[i].w=read();
ne[i]=f[mp[i].u];
f[mp[i].u]=i;
}
for(int i=1;i<=n;i++)
bcj[i]=i;
sort(mp+1,mp+1+m,cmp);
while(jsq!=cost){
if(fa(bcj[mp[num].u])!=fa(bcj[mp[num].v])){
bcj[fa(bcj[mp[num].u])] =bcj[fa(bcj[mp[num].v])];
jsq--;
ans+=mp[num].w;
}
num++;
}
cout<<ans;
return 0;
}