图论题目

题目描述

给出一个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;
}

猜你喜欢

转载自blog.csdn.net/PUBG___/article/details/86550991