洛谷 P1144 最短路计数 Label:水
题目描述
给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。
输入输出格式
输入格式:
输入第一行包含2个正整数N,M,为图的顶点数与边数。
接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。
输出格式:
输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可。如果无法到达顶点i则输出0。
输入输出样例
输入样例#1:
5 7 1 2 1 3 2 4 3 4 2 3 4 5 4 5
输出样例#1:
1 1 1 2 4
说明
1到5的最短路有4条,分别为2条1-2-4-5和2条1-3-4-5(由于4-5的边有2条)。
对于20%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 100000,M ≤ 200000。
代码
QAQ,水题就别看了吧1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<queue> 7 #define INF 0x3f3f3f3f 8 #define MAXN 500000 9 using namespace std; 10 11 struct cc{ 12 int d,num; 13 }; 14 15 struct cmp{ 16 bool operator()(cc a,cc b){ 17 return a.d>b.d; 18 } 19 }; 20 21 cc make_(int num,int d){ 22 cc x;x.d=d;x.num=num;return x; 23 } 24 25 priority_queue<cc,vector<cc>,cmp> que; 26 vector<int> G[MAXN]; 27 int N,M,s,t; 28 int dis[MAXN],vis[MAXN]; 29 int sum[MAXN]; 30 31 void Dijkstra(){ 32 memset(dis,0x3f,sizeof(dis)); 33 que.push(make_(1,0)); 34 dis[1]=0;sum[1]=1; 35 while(!que.empty()){ 36 cc x=que.top();que.pop(); 37 if(vis[x.num])continue;vis[x.num]=1; 38 for(int i=0;i<G[x.num].size();i++){ 39 int to=G[x.num][i]; 40 if(dis[x.num]+1<dis[to]){ 41 if(dis[to]==INF) {sum[to]=sum[x.num];sum[to]%=100003;} 42 dis[to]=dis[x.num]+1; 43 que.push(make_(to,dis[to])); 44 } 45 else if(dis[x.num]+1==dis[to]){sum[to]+=sum[x.num];sum[to]%=100003;} 46 // printf("%d") 47 } 48 } 49 } 50 51 void init_(){ 52 scanf("%d%d",&N,&M); 53 int u,v,w; 54 for(int i=1;i<=M;i++){ 55 scanf("%d%d",&u,&v); 56 G[u].push_back(v); 57 G[v].push_back(u); 58 } 59 Dijkstra(); 60 } 61 62 int main(){ 63 // freopen("01.in","r",stdin); 64 init_(); 65 for(int i=1;i<=N;i++){ 66 printf("%d\n",sum[i]); 67 } 68 return 0; 69 }跟热浪同一个类型吧
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!