C
Time Limit: 7000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给出一个带权无向图,包含n个点,m条边。求出s,e的最短路。保证最短路存在。
输入
多组输入。
对于每组数据。
第一行输入n,m(1<= n && n<=5*10^5,1 <= m && m <= 2*10^6)。
接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。
最后输入s,e。
接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。
最后输入s,e。
输出
对于每组数据输出一个整数代表答案。
示例输入
3 1
1 2 3
1 2
示例输出
3
提示
来源
zmx
#include <stdio.h>
#include <string.h>
const int inf = 1 << 29;
struct node
{
int u;
int v;
int w;
}ls[4000010];
int num;
int dis[500010];
void creat(int x,int y,int z)
{
ls[num].u = x;
ls[num].v = y;
ls[num].w = z;
num++;
}
void bf(int n,int s,int t)
{
for(int i = 0;i <= n;i++)
dis[i] = inf;
dis[s] = 0;
for(int i = 0;i < n - 1;i++)
{
bool flag = false;
for(int j = 0;j < num;j++)
{
int a = ls[j].u;
int b = ls[j].v;
int c = ls[j].w;
if(dis[b] > dis[a] + c)
{
dis[b] = dis[a] + c;
flag = true;
}
}
if(!flag)
break;
}
printf("%d\n",dis[t]);
}
int main()
{
int n,m,x,y,z,s,t;
while(~scanf("%d%d",&n,&m))
{
num = 0;
for(int i = 0;i < m;i++)
{
scanf("%d%d%d",&x,&y,&z);
creat(x,y,z);
creat(y,x,z);
}
scanf("%d%d",&s,&t);
bf(n,s,t);
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct node
{
int v;
int w;
int next;
}ls[4000010];
int dis[500010];
int head[500010];
bool vis[500010];
int num;
bool operator < (node a,node b)
{
return a.w > b.w;
}
priority_queue <node> q;
void creat(int x,int y,int z)
{
ls[num].v = y;
ls[num].w = z;
ls[num].next = head[x];
head[x] = num++;
}
void spfa(int n,int s,int e)
{
memset(vis,false,sizeof(vis));
while(!q.empty())
q.pop();
node f,t;
t.v = s;
t.w = 0;
q.push(t);
while(!q.empty())
{
t = q.top();
q.pop();
if(t.v == e)
{
printf("%d\n",t.w);
return ;
}
if(!vis[t.v])
{
vis[t.v] = true;
for(int i = head[t.v];~i;i = ls[i].next)
{
int a = ls[i].v;
if(!vis[a])
{
f.v = a;
f.w = t.w + ls[i].w;
q.push(f);
}
}
}
}
printf("-1\n");
}
int main()
{
int n,m,x,y,z,s,e;
while(~scanf("%d%d",&n,&m))
{
num = 0;
memset(head,-1,sizeof(head));
for(int i = 0;i < m;i++)
{
scanf("%d%d%d",&x,&y,&z);
creat(x,y,z);
creat(y,x,z);
}
scanf("%d%d",&s,&e);
spfa(n,s,e);
}
return 0;
}