标签:als win ane tree not i++ 学习 limit lan
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
求到达某点路径最小边权中的最大值 分开来看 先看求最大值这个问题 这个问题是和最短路思想一致的 状态转移和青蛙的那道题类似
这里再说下dijstra的算法具体实现 算法的思想是先找一个最短距离确定的点 然后拿这个点去更新它能达到点的距离 不断重复这个过程,
理解这个问题的时候,我卡在了同一个点有不同最短路怎么处理的问题。,。 其实很简单了 先明白一点 新的最短距离确定的点的生成是在更新的时候出现的
那么已经是最短距离的点在更新的时候由于条件的判断 不会造成干扰 不过还是可以再次访问的
上两个代码。
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int x,cost;
};
typedef pair<int,int> p;// first->x second ->到已经确定集合的最短距离 这个的定义要理解清楚 是点到已经处理集合的最值距离!
vector<node> edge[1001];
int n,m;
void dijstra(int s)
{
int d[1001];
fill(d,d+1001,0);
priority_queue<p,vector<p>,less<p> > que;//这里的定义要学习一下
d[s]=1000001;
que.push(p(s,1000001));
while(!que.empty())
{
p temp = que.top();
que.pop();
if(d[temp.first] > temp.second) continue;// 拿出的点不是距离最大 丢掉! 这个很重要 !
for(int i=0;i<edge[temp.first].size();i++)
{
int x=edge[temp.first][i].x,cost=edge[temp.first][i].cost;
if(d[temp.first] > d[x]&&cost>d[x])
{
d[x]=min(d[temp.first],cost);
que.push(p(x,d[x]));
}
}
}
cout<<d[n]<<endl;
cout<<endl;
}
void init()
{
for(int i=1;i<=n;i++) edge[i].clear();
}
int main()
{
cin.sync_with_stdio(false);
int t;
cin>>t;
init();
for(int Case=1;Case<=t;Case++)
{
cin>>n>>m;
node temp;
int x,y;
while(m--)
{
cin>>x>>y>>temp.cost;
temp.x=x;
edge[y].push_back(temp);
temp.x=y;
edge[x].push_back(temp);
}
printf("Scenario #%d:\n",Case);
dijstra(1);
}
return 0;
}
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int x,cost;
};
int mapp[1010][1010];
int n,m;
int min(int x,int y)
{
if(x>y) return y;
else return x;
}
void dijstra(int s)
{
int vis[1010],d[1010];
for(int i=1;i<=n;i++)
{
d[i]=mapp[1][i];
vis[i]=0;
}
for(int i=1;i<=n;i++)
{
int v=-1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&(d[i]>d[v]||v == -1)) v=i;
}
//if(v==-1) break;
vis[v]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&d[i]<min(mapp[v][i],d[v])) d[i]=min(d[v],mapp[v][i]);
}
}
cout<<d[n]<<endl<<endl;
}
int main()
{
cin.sync_with_stdio(false);
int t;
cin>>t;
memset(mapp,0,sizeof(mapp));
for(int Case=1;Case<=t;Case++)
{
cin>>n>>m;
int x,y,z;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>z;
mapp[x][y]=mapp[y][x]=z;
}
printf("Scenario #%d:\n",Case);
dijstra(1);
}
return 0;
}
标签:als win ane tree not i++ 学习 limit lan
原文地址:http://www.cnblogs.com/z1141000271/p/6536078.html