1045: 帮美女省钱
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 127 Solved: 14
[ Submit][ Status][ Web Board]
Description
传说中有个美女,你可以把她当成宣姐,她有些生活必需品需要到某个商场购买,她从华师出发要坐车去商场,华师到那个商场有多条路可以走,并且到了某个站点后转车,并且每一条线路的车费不一定相同,为了节省更多的钱去商场购物,于是她想找出一条需要的车费最少的路线,你能帮助美女排忧解难么?(站点从1到n编号,其中华师编号为1,商场编号为n)
Input
第一行输入为n,m(2<=n<=10000,m<=100000),表示华师到商场可能经过的站点的总个数(当然包括华师和商场),m表示线路(单向)的条数,接下来的m行,每行包含三个数x,y,c,表示站点x到站点y所需要的车费(注意两个站点之间可能存在多条路线,c>=0且其它数据大小不超过int32)
Output
输出一行,表示所需的最少车费(int32位内),,如果不能到达则输出-1.
Sample Input
4 4
1 2 1
1 3 2
2 4 3
3 4 4
Sample Output
4
HINT
Source
// MLE dijkstra 不行
#include <stdio.h>
#include <algorithm>
#include <iostream>
#define maxn 0x3fffffff
using namespace std;
int m,n;
int map[10100][10100],d[10100];
int vis[10100];
void dijkstra(int start)
{
int i,x,y,mm;
for(i=1;i<=n;i++)
d[i]=(i==start?0:maxn);
for(i=1;i<=n;i++)
{
mm=maxn;
for(y=1;y<=n;y++)
if(!vis[y]&&d[y]<=mm)
{
mm=d[y];
x=y;
}
vis[x]=1;
for(y=1;y<=n;y++)
d[y]=min(d[y],d[x]+map[x][y]);
}
}
int main()
{
while(cin>>n>>m)
{for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=maxn;
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
if(map[a][b]>c)
map[a][b]=map[b][a]=c;
}
dijkstra(1);
printf("%d\n",d[n]);}
return 0;
}
// RE 还是不行
#include <stdio.h>
#include <iostream>
#include <queue>
#define N 700
using namespace std;
const int maxn=100000000;
int d[N];
int m,n;
int map[N][N];
void spfa(int s)
{
for(int i=1;i<=n;i++)
d[i]=maxn;
int queue[N*N]={0};
bool vis[N]={false};
int front=0,rear=1;
queue[front]=s;
vis[s]=true;
d[s]=0;
while(front<rear)
{
int u=queue[front];
vis[u]=false;
for(int i=1;i<=n;i++)
{
if(d[i]>d[u]+map[u][i])
{
d[i]=d[u]+map[u][i];
if(!vis[i])
{
vis[i]=true;
queue[rear++]=i;
}
}
}
front++;
}
}
int main()
{
int a,b,c;
int start,end;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
map[i][j]=map[j][i]=0;
else
map[i][j]=map[j][i]=maxn;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c<map[a][b]?c:map[a][b];
}
start=1;
end=n;
spfa(start);
printf("%d\n",d[end]);
}
return 0;
}
// 标答
#include<iostream>
#include<cstdio>
#include<string.h>
#include<stdio.h>
#include<queue>
using namespace std;
const int M = 100050;
const int N = 10050;
const int Max=0xfffffff;
struct node
{
int v, w,next;
}edge[M];
int first[N];
int dist[N];
bool isque[N];
void add(int u, int v, int w, int e)
{
edge[e].v = v;
edge[e].w = w;
edge[e].next=first[u];
first[u] = e;
}
int spfa(int n)
{
queue<int> Que;
int i;
for(i=1;i<=n;i++)
{
isque[i]=false;
dist[i]=Max;
}
dist[1] = 0;
isque[1]=true;
Que.push(1);
while(!Que.empty())
{
int u = Que.front();
Que.pop();
for(int e = first[u];e!=-1;e=edge[e].next)
{
int v = edge[e].v;
if(dist[v]>dist[u]+edge[e].w)
{
dist[v]=dist[u]+edge[e].w;
if(isque[v]==false)
{
isque[v]=true;
Que.push(v);
}
}
}
isque[u]=false;
}
if(dist[n]==Max)
return -1;
return dist[n];
}
int main ()
{
int n, m,u,v,w,i;
// freopen("B.in","r",stdin);
// freopen("D.out","w+",stdout);
while(scanf("%d%d",&n,&m)!= EOF)
{
memset(first,-1,sizeof(first));
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w,i);
}
printf("%d\n",spfa(n));
}
return 0;
}
168万+

被折叠的 条评论
为什么被折叠?



