计蒜客习题:最短路简化版

来源:互联网 发布:怎么查网络丢包率 编辑:程序博客网 时间:2024/06/03 21:12

经历一周忙碌的工作后,蒜头君想趁着周末好好游玩一番。蒜头君想去好多好多地方,他想去南锣鼓巷吃各种好吃的,想去颐和园滑冰,还想去怀柔滑雪场滑雪……可是时间有限,蒜头君并不能玩遍所有的地方,最后他决定去几个离他较近的。

我们知道蒜头君一共想去 NN 个地方玩耍,编号从 11 到 NN,并且知道了蒜头君所在地方的编号 CC,以及 MM 条路径。现在蒜头君想让你帮他算一算,他到每个地方分别需要经过多少个地方?

输入格式

第一行输入三个正整数 N, M, CN,M,C。代表蒜头君想去 NN 个地方,有 MM 条路径,蒜头君在编号为 CC 的地方。1 \leq N, C \leq 10001N,C10001 \leq C \leq N1CN1 \leq M \leq 100001M10000

保证没有重复边,且图中所有点互相连通。

输出格式

输出 NN 行,按编号从小到大,输出结果。第 ii行表示蒜头君到编号为 ii 的地方,需要经过多少个地方。

样例输入

5 5 21 22 32 43 43 5

样例输出


10112

vector版邻接表没加无向边被卡了……
#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<vector>using namespace std;vector<int> adj[1007];void ins(int u,int v){    adj[u].push_back(v);    adj[v].push_back(u);}int n,m,c,ans[1007],book[1007];void bfs(){    queue<int> q;    memset(ans,0,sizeof(ans));    q.push(c);    book[c]=1;    while(!q.empty()){        int t=q.front();        for(int i=0;i<adj[t].size();i++)        {            if(book[adj[t][i]]==0)            {                book[adj[t][i]]=1;                ans[adj[t][i]]=ans[t]+1;                q.push(adj[t][i]);            }        }       q.pop();    }}void print(){    for(int i=1;i<=n;i++)        printf("%d\n",ans[i]);}inline int read(){int x;scanf("%d",&x);return x;}int main(){    scanf("%d%d%d",&n,&m,&c);    for(int i=1;i<=m;i++){        ins(read(),read());    }    bfs();    print();    return 0;}


原创粉丝点击