您的位置:首页 > 其它

洛谷P1144 最短路计数

2018-01-18 21:13 295 查看
思路
用spfa算法,建一个邻接表,然后用ans[i]表示这个点到点1的最短路个数。
代码
#include<cstdio>
#include<map>
#define INF 2147483647
#define M 2000001
#define N 1000001
#include<cstring>
#define r(i,a,b) for (int i=a;i<=b;i++)
using namespace std;int n,m,k,x,y,minn,t,u;
int min(int x,int y){return x<y?x:y;}
int max(int x,int y){return x>y?x:y;}
int team[M*2],head=0,tail=1,dis
,c,d,fa[M],p;
int tot,ans
={0,1};
bool v
;
struct node{int next,to;}a[M];//邻接表
void read(int &f)//输入流
{
f=0;char c;bool d=0;
while (c=getchar(),c<'0'||c>'9') if (c=='-') d=1;f=f*10+c-48;
while (c=getchar(),c>='0'&&c<='9') f=f*10+c-48;
if (d) f*=-1;
}
void add(int u,int v)//建图
{
a[++tot].next=fa[u];
a[tot].to=v;
fa[u]=tot;
}
void write(int x)//输出流
{
if (x<0) {putchar('-');x=-x;}
if (!x) {putchar(48);return;}
if (!(x/10)){putchar(x%10+48);return;}
write(x/10);putchar(x%10+48);
}
void LRZ()
{
read(n);read(m);r(i,1,m) fa[i]=-1;
r(i,1,m)
{
read(x);read(y);
add(x,y);add(y,x);//无向图
}
}
void work()
{
minn=INF;
r(j,1,n) dis[j]=INF;
dis[1]=head=0;team[1]=1;tail=v[1]=1;//初始化
do
{
head=head%N+1;
u=team[head];v[u]=true;
for (int i=fa[u];i!=-1;i=a[i].next)
{
if (dis[a[i].to]>dis[u]+1)//权值就是1
{
dis[a[i].to]=dis[u]+1;ans[a[i].to]=ans[u];//如果两个点可以到达,那么最短路个数相同
if(!v[a[i].to])
{
tail=tail%N+1;
team[tail]=a[i].to;
v[a[i].to]=1;
}
}
else
if (dis[a[i].to]==dis[u]+1)
ans[a[i].to]=(ans[a[i].to]+ans[u])%100003;//把两个点的最短路个数加在一起
}
v[u]=false;
}while(head!=tail);
}
void print()
{
r(i,1,n) {write(ans[i]);putchar(10);}//输出
}
int main()
{
LRZ();

4000
work();
print();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: