最小生成树
最短路径
笔记
例题
POJ 1251
最小生成树模板题
#include <iostream>
#include<cstdio>
#include <cstring>
using namespace std;
const int INF = 1e4;
int arc[30][30];
int dis[30];
int main()
{
std::ios::sync_with_stdio(false);
int n;
while(~scanf("%d",&n)&&n)
{
memset(arc,INF,sizeof arc);
memset(dis,INF,sizeof dis);
char a;
int k;
for(int i = 0;i < n-1;i++)
{
cin >> a >> k;
int x;
char b;
while(k--)
{
cin >> b >> x;
arc[a-'A'][b-'A'] = x;
arc[b-'A'][a-'A'] = x;
}
getchar();
}
for(int i = 1;i < n;i++)
{
dis[i] = arc[0][i];
}
int sum = 0;
int v = 0;
dis[0] = -1;
for(int p = 1;p <= n-1;p++)
{
int minx = INF;
for(int i = 1;i <= n-1;i++)
if(dis[i]!=-1&&minx > dis[i])
{
minx = dis[i];
v = i;
}
sum += dis[v];
dis[v]=-1;
for(int i = 1;i <= n-1;i++)
{
if(dis[i] > arc[v][i])
{
dis[i] = arc[v][i];
}
}
}
cout << sum << endl;
}
return 0;
}
HDU 最短路
迪杰特斯拉模板
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF = 1e9;
int arc[105][105];
int dis[105];
bool vis[105];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)&&n&&m)
{
for(int i=0;i<=n;++i){
for(int j=0;j<=n;++j){
arc[i][j]=INF;
}
}
memset(vis,false,sizeof vis);
for(int i=1;i<=n;++i){
dis[i]=arc[1][i];
}
for(int i = 0;i < m;i++)
{
int a,b,c;
cin >> a >> b >> c;
if(c < arc[a][b])
{
arc[a][b] = c;
arc[b][a] = c;
}
}
for(int i = 1; i <= n;i++)
{
dis[i] = arc[1][i];
}
vis[1] = true;
dis[1] = 0;
int v ;
for(int i = 1;i <= n;i++)
{
int minx = INF;
for(int j = 1;j <= n;j++)
{
if(!vis[j] && minx > dis[j])
{
minx = dis[j];
v = j;
}
}
vis[v] = true;
for(int j = 1;j <= n;j++)
{
if(!vis[j]&& arc[v][j] < INF &&dis[j] > dis[v]+arc[v][j])
{
dis[j] = dis[v] + arc[v][j];
}
}
}
printf("%d\n",dis[n]);
}
return 0;
}