| ||||||||||||||||
一个人的旅行Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 47968 Accepted Submission(s): 15915 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
Input 输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
Output 输出草儿能去某个喜欢的城市的最短时间。
Sample Input 6 2 31 3 51 4 72 8 123 8 44 9 129 10 21 28 9 10
Sample Output 9 |
迪杰斯特拉,一遍敲出来,输出inf,怎么回事??看代码ing,20min后,没问题啊,再看看??屮,minn更新写反了!!
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
int arr[1111][1111];
int tp[1111],vis[1111];
int e[1111];
int n;
void dij()
{
memset(vis,0,sizeof(vis));
vis[0]=1;
for(int i=0;i<=n;i++)
tp[i]=arr[0][i];
int f=0;
for(int i=1;i<=n;i++)
{
int indx=0,minn=inf;
for(int j=0;j<=n;j++)
{
if(!vis[j] && minn>tp[j])
{
minn=tp[j];
indx=j;
}
}
if(!indx)
{
f=1;
break;
}
vis[indx]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j] && tp[j]>arr[indx][j]+tp[indx])
tp[j]=arr[indx][j]+tp[indx];
}
}
}
int main(){
int T,S,d;
while(cin>>T>>S>>d)
{
for(int i=0;i<1111;i++)for(int j=0;j<1111;j++)arr[i][j]=inf,arr[i][i]=0;n=0;
for(int i=0;i<T;i++)
{
int x,y,z;
cin>>x>>y>>z;
n=max(max(x,y),n);
if(arr[x][y]==inf||arr[x][y]>z)
{
arr[x][y]=arr[y][x]=z;
}
}
for(int i=0;i<S;i++)
{
int c;
scanf("%d",&c);
arr[c][0]=arr[0][c]=0;
}
for(int i=0;i<d;i++)
scanf("%d",&e[i]);
dij();
int m=inf;
for(int i=0;i<d;i++)
m=min(m,tp[e[i]]);
printf("%d\n",m);
}
return 0;
}
加个模板
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
int arr[1024][1024];
int tp[1024],vis[1024];
int n;
void dij()
{
memset(vis,0,sizeof(vis));
vis[1]=1;
for(int i=1;i<=n;i++)
tp[i]=arr[1][i];
int f=0;
for(int i=2;i<=n;i++)
{
int indx=0,minn=inf;
for(int j=1;j<=n;j++)
{
if(!vis[j] && minn>tp[j])
{
minn=tp[j];
indx=j;
}
}
if(!indx)
{
f=1;
break;
}
vis[indx]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j] && tp[j]>arr[indx][j]+tp[indx])
tp[j]=arr[indx][j]+tp[indx];
}
}
}
int main(){
return 0;
}
最近在看堆优化,找了个模板套了一下
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<utility>
#include<vector>
#include<queue>
#include<string.h>
#define MAXN 20000
#define INF 0x3f3f3f3f//2147483647
using namespace std;
typedef pair<int,int> pii;
priority_queue<pii, vector<pii>, greater<pii> > pq;
struct edge
{
int to;
int cost;
};
vector<edge> G[MAXN];//g[i]--i to g[i].to cost cost
int n, m, s;
int dis[MAXN];
int vis[10000];
int E[10000];
void dijk(int s)
{
for(int i = 1; i <= n+1; i++)
dis[i] = INF;
dis[s] = 0;
pq.push(make_pair(0,s));
// cout<<dis[s]<<endl;
while(!pq.empty())
{
pii u = pq.top();
pq.pop();
int x = u.second; // bian hao
if(vis[x]) continue;
vis[x] = 1;
//cout<<x<<endl;
for(int i = 0; i < G[x].size(); i++)
{
edge e = G[x][i];
if(dis[e.to] > dis[x] + e.cost)
{
dis[e.to] = dis[x] + e.cost;
pq.push(make_pair(dis[e.to], e.to));
// cout<<dis[e.to]<<endl;
}
}
}
}
int main()
{
int T,S,D;
while(cin>>T>>S>>D)
{
n = 0;
for(int i = 0;i<MAXN;i++)G[i].clear();
memset(vis,0,sizeof(vis));
int from, to, cost;
edge in;
for(int i = 0; i < T; i++)
{
scanf("%d%d%d",&from ,&to ,&cost);
n=max(n,max(from,to));
in.to = to; in.cost = cost;
G[from].push_back(in);
in.to = from;
G[to].push_back(in);
}
// cout<<endl;
int c;
for(int i = 0; i < S ; i++ )
{
scanf("%d",&c);
in.to = c; in.cost = 0;
G[n+1].push_back(in);
in.to = n+1;
G[c].push_back(in);
}
for(int i = 0; i < D ; i++ )
{
scanf("%d",&E[i]);
}
dijk(n+1);
int minn=0x3f3f3f3f;
for(int i = 0 ;i < D ; i++)
minn = min(minn,dis[E[i]]);
printf("%d\n",minn);
}
return 0;
}