比赛 |
20121107 |
评测结果 |
AAAAA |
题目名称 |
最难的任务 |
最终得分 |
100 |
用户昵称 |
xm1994 |
运行时间 |
0.098 s |
代码语言 |
C++ |
内存使用 |
3.15 MiB |
提交时间 |
2012-11-07 08:55:59 |
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <cstring>
using namespace std;
struct node {
int v,w;
node *next;
};
const int maxn=202;
struct distnation{
int ans;
bool inq;
};
node *map[maxn];
distnation dist[maxn];
inline void init()//initmap
{
for(int i=0;i<maxn;i++)
{
node *p=map[i];
while (p!=NULL)
{
node *pnext=p->next;
free(p);
p=pnext;
}
map[i]=NULL;
}
}
inline void init_sou(int s)//init distnation
{
for(int i=0;i<maxn;i++)
{
dist[i].ans=0x7fffffff;
dist[i].inq=false;
}
dist[s].ans=0;
}
inline void addedge(int u,int v,int w)//add an edge
{
node *p=(node *)malloc(sizeof(node));
p->v=v;
p->w=w;
p->next=map[u];
map[u]=p;
}
inline void relax(int u,int v,int w)
{
if(dist[v].ans>dist[u].ans+w)
dist[v].ans=dist[u].ans+w;
}
void spfa(int s)
{
init_sou(s);
queue<int> q;
q.push(s);
dist[s].inq=true;
while(!q.empty())
{
int u=q.front();
q.pop();
dist[u].inq=false;
node *p=map[u];
while(p)
{
int t=dist[p->v].ans;
relax(u,p->v,p->w);
if(t!=dist[p->v].ans&&!dist[p->v].inq)
{
q.push(p->v);
dist[p->v].inq=true;
}
p=p->next;
}
}
}
inline void lets_go()
{
int n,m;
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,c);
}
spfa(1);
if(dist[n].ans!=0x7fffffff)
printf("%d\n",dist[n].ans);
else printf("%d\n",-1);
}
inline void assign()
{
freopen("hardest.in","rt",stdin);
freopen("hardest.out","wt+",stdout);
}
int main(void)
{
int T;
assign();
scanf("%d",&T);
for(int i=0;i<T;i++)
lets_go();
return 0;
}