记录编号 |
229202 |
评测结果 |
AAAAAAAAAAA |
题目名称 |
[福州培训2010] 最短路 |
最终得分 |
100 |
用户昵称 |
Go灬Fire |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.176 s |
提交时间 |
2016-02-20 06:40:00 |
内存使用 |
0.45 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
#include<cmath>
#define Mem(arr,val) memset(arr,val,sizeof(arr));
using namespace std;
const int maxn=110;
const int maxe=maxn*maxn;
struct Edge{
int to,dis,next;
}e[maxe];
struct Node{
int num,dis;
Node(){ };
Node(int a,int b){num=a;dis=b;}
bool operator <(const Node&a)const
{
return dis>a.dis;
}
};
int n,m,len=0,d[maxn][maxn],head[maxn];
void Init();
void Insert(int,int,int);
void Dijs(int);
int main()
{
freopen("shorta.in","r",stdin);
freopen("shorta.out","w",stdout);
Init();
for(int i=1;i<=n;i++)
{
Dijs(i);
cout<<endl;
}
return 0;
}
void Init()
{
Mem(e,0);Mem(d,-1);Mem(head,-1);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Insert(x,y,z);
Insert(y,x,z);
}
}
void Insert(int x,int y,int z)
{
len++;
e[len].to=y;
e[len].dis=z;
e[len].next=head[x];
head[x]=len;
}
void Dijs(int x)
{
int dis[maxn];bool f[maxn];
Mem(f,0);Mem(dis,0x7f);
priority_queue<Node> q;
dis[x]=0;f[x]=1;
q.push(Node(x,dis[x]));
while(!q.empty())
{
Node temp=q.top();
q.pop();
int k=temp.num;f[k]=1;
for(int i=head[k];i!=-1;i=e[i].next)
{
int j=e[i].to;
if(!f[j] && dis[j]>dis[k]+e[i].dis)
{
dis[j]=dis[k]+e[i].dis;
q.push(Node(j,dis[j]));
}
}
}
for(int i=1;i<=n;i++)
{
d[x][i]=dis[i];
cout<<dis[i]<<" ";
}
}