最短路计数 [LuoGu P 1144]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路计数 [LuoGu P 1144]相关的知识,希望对你有一定的参考价值。
题目大意 :
给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。
大水题 , 为了备忘 , 还是记下来吧 .
不推方程了,,,,in Code .
1 //Copyright(C)Sunshine. 2 //2017.11.03 3 //*Dijkstra: 4 #include<cstdio> 5 #include<cstring> 6 #include<queue> 7 #include<vector> 8 using namespace std; 9 const int INF=2147483647; 10 const int MAXN=1e6+1,MOD=100003; 11 int SP[MAXN],cnt[MAXN]; 12 struct Edge 13 { 14 int to,dis; 15 Edge(int t=0,int d=INF):to(t),dis(d){} 16 }; 17 vector<Edge>E; 18 vector<int>G[MAXN]; 19 struct HeapNode 20 { 21 int u,dis; 22 HeapNode(int x=0,int d=INF):u(x),dis(d){} 23 bool operator < (const HeapNode& r) const {return this->dis>r.dis;} 24 }; 25 priority_queue<HeapNode>Q; 26 inline int read() 27 { 28 int f=1,x=0;char c=getchar(); 29 while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} 30 while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} 31 return f*x; 32 } 33 void insert(int from,int to,int dis) 34 { 35 E.push_back(Edge(to,dis)); 36 G[from].push_back(E.size()-1); 37 } 38 int main() 39 { 40 int n=read(),m=read(); 41 for(int i=1;i<=m;i++) 42 { 43 int x=read(),y=read(); 44 insert(x,y,1); 45 insert(y,x,1); 46 } 47 for(int i=0;i<=n+1;i++)SP[i]=INF; 48 SP[1]=0;cnt[1]=1; 49 Q.push(HeapNode(1,SP[1])); 50 while(!Q.empty()) 51 { 52 HeapNode a=Q.top();Q.pop(); 53 if(a.dis!=SP[a.u])continue; 54 int siz=G[a.u].size(); 55 for(int i=0;i<siz;i++) 56 { 57 Edge it=E[G[a.u][i]]; 58 if(SP[it.to]>SP[a.u]+it.dis) 59 { 60 cnt[it.to]=cnt[a.u]; 61 SP[it.to]=SP[a.u]+it.dis; 62 Q.push(HeapNode(it.to,SP[it.to])); 63 } 64 else if(SP[it.to]==SP[a.u]+1) 65 cnt[it.to]=(cnt[it.to]+cnt[a.u])%MOD; 66 } 67 } 68 for(int i=1;i<=n;i++) 69 if(SP[i]<INF)printf("%d%c",cnt[i],10); 70 else printf("%d%c",0,10); 71 return 0; 72 } 73 //*SPFA: 74 //#include<cstdio> 75 //#include<cstring> 76 //#include<queue> 77 //#include<iostream> 78 //using namespace std; 79 //const int N=1e6+1,M=2e6+1; 80 //const int mod=100003,INF=1e7+1,dis=1; 81 //int h[N],cnt[N],sp[N],Ect=0; 82 //bool vis[N]; 83 //struct Graph{ 84 // int to,link; 85 // Graph(){to=link=0;} 86 //}; 87 //Graph G[M]; 88 //queue<int>q; 89 // 90 //void AddEdge(int from,int to) 91 //{ 92 // Ect++; 93 // G[Ect].link=h[from]; 94 // G[Ect].to=to; 95 // h[from]=Ect; 96 //} 97 //inline int read() 98 //{ 99 // char c=getchar();int f=1,s=0; 100 // while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} 101 // while(c>=‘0‘&&c<=‘9‘){s=s*10+c-‘0‘;c=getchar();} 102 // return s*f; 103 //} 104 //int main() 105 //{ 106 // for(int i=0;i<N;i++)sp[i]=INF; 107 // memset(cnt,0,sizeof(cnt)); 108 // const int begin=1; 109 // int n=read(),m=read(); 110 // for(int i=1,x,y;i<=m;i++) 111 // { 112 // x=read();y=read(); 113 // AddEdge(x,y);AddEdge(y,x); 114 // } 115 // int now=0; 116 // sp[begin]=0; 117 // q.push(begin); 118 // vis[begin]=true; 119 // cnt[begin]=1; 120 // while(!q.empty()) 121 // { 122 // now=q.front(); 123 // q.pop(); 124 // vis[now]=false; 125 // for(int it=h[now];it!=0;it=G[it].link) 126 // if(sp[now]+dis==sp[G[it].to]) 127 // { 128 // cnt[G[it].to]+=cnt[now]; 129 // cnt[G[it].to]%=mod; 130 // } 131 // else if(sp[now]+dis<sp[G[it].to]) 132 // { 133 // cnt[G[it].to]=cnt[now]; 134 // sp[G[it].to]=sp[now]+dis; 135 // if(!vis[G[it].to]) 136 // { 137 // q.push(G[it].to); 138 // vis[G[it].to]=true; 139 // } 140 // } 141 // } 142 // for(int i=1;i<=n;i++) 143 // printf("%d\n",cnt[i]); 144 // return 0; 145 //}
以上是关于最短路计数 [LuoGu P 1144]的主要内容,如果未能解决你的问题,请参考以下文章
最短路 P1144 最短路计数Dijkstra堆优化/SPFA