一时间没找着最短路问题,仿照L2-4 深入虎穴 (25 分)的输入捏了一个
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n;
cin>>n;//定点数量
int a[n+1][n+1];//邻接表
for(int i=1;i<=n;i++)
{
int m;
cin>>m;
while(m--)
{
int k,l;
cin>>k>>l;//链接的点与对应的距离
a[i][k]=l;
a[k][i]=l;
}
}
priority_queue<int,vector<int>,greater<int> > q;
int zui[n+1]={0};
map<int,int> mp;//由于队列存距离,则需要利用map实现队列到点的转换
for(int i=1;i<=n;i++)
{
zui[i]=10000;
}
int vis[n+1]={0};
int s,e;
cin>>s>>e;
q.push(0);
zui[s]=0;
mp[0]=s;
while(!q.empty())
{
//cout<<zui[1]<<endl;
int ss=q.top();
q.pop();
ss=mp[ss];
vis[ss]=1;
for(int i=1;i<=n;i++)
{
if(a[ss][i]&&!vis[i])
{
zui[i]=min(zui[i],a[ss][i]+zui[ss]);
mp[zui[i]]=i;
q.push(zui[i]);
}
}
}
for(int i=1;i<=n;i++)
cout<<zui[i]<<endl;
system("pause");
return 0;
}
第二种方法(http://blog.sina.com.cn/s/blog_77dc9e080101203j.html),利用pair实现的顶点与最短距离的对应
#include <cstdio>
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
#define MAX 100
const int INF = (1<<30) - 1;
typedef pair<int,int> pii;
priority_queue< pii , vector<pii> , greater<pii> > q; //优先队列
int edges[MAX][MAX]; //邻接表
int n , m;
int d[MAX]; //路径长度
void init()
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j)
{
if(i == j)
edges[i][j] = 0;
else
edges[i][j] = INF;
}
}
}
void dijkstra(int v)
{
bool done[MAX];
for(int i = 0; i < n; ++i)
{
d[i] = (edges[v][i] == 0 ? 0 : INF);
}
memset(done,0,sizeof(done));
q.push(make_pair(d[v],v)); \\ v:起点
while(!q.empty())
{
pii u = q.top();
q.pop();
int x = u.second;
if(done[x]) continue;
done[x] = true;
for(int j = 0; j < n; ++j)
{
if(!done[j] && edges[x][j] < INF && d[x] + edges[x][j] < d[j])
{
d[j] = d[x] + edges[x][j];
q.push( make_pair(d[j],j) );
}
}
}
for(int i = 0; i < n; ++i)
{
cout << d[i] << endl;
}
}
int main()
{
int vi = 0;
int u , v , w;
cin >> n >> m;
init();
for(int i = 0; i < m; ++i) //无向图的输入
{
cin >> u >> v >> w;
edges[u][v] = edges[v][u] = w;
}
dijkstra(vi);
return 0;
}