http://www.luogu.org/problem/show?pid=1529#
最短路裸题,一开始想都没想就打了个SPFA,还因为没看清是无向图卡了半天,结果发现Floyd就行orz。。。
SPFA(蠢)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#define INF 0x3f3f3f
using namespace std;
const int maxn=20010;
int head[maxn],k=1,n,dis[maxn];
bool vis[maxn];
struct edge{
int w,v,next;
}e[maxn];
void addedge(int u,int v,int w){e[k].v=v;e[k].w=w;e[k].next=head[u];head[u]=k++;}
int spfa(int s)
{
memset(vis,0,sizeof(vis));
memset(dis,INF,sizeof(dis));
queue<int> q;
dis[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty())
{
int t=q.front();
vis[t]=1;
q.pop();
for(int i=head[t];i;i=e[i].next)
{
int v=e[i].v;
if(dis[v]>dis[t]+e[i].w)
{
dis[v]=dis[t]+e[i].w;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
return dis['Z'];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
char c1[2],c2[2];
int w;
scanf("%s%s%d",c1,c2,&w);
int x=c1[0],y=c2[0];
addedge(x,y,w);
addedge(y,x,w);
}
int ans=INF;
int ansi;
for(int i='A';i<='Y';i++)
{
if(spfa(i)<ans)
{
ansi=i;
ans=spfa(i);
}
}
printf("%c %d",ansi,ans);
return 0;
}
Floyd(正解)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#define INF 0x3f3f3f
using namespace std;
int n,ans,ansi,mp[200][200];
int main()
{
memset(mp,INF,sizeof(mp));
ans=INF;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
char c1[2],c2[2];
int w;
scanf("%s%s%d",c1,c2,&w);
mp[c1[0]][c2[0]]=min(mp[c1[0]][c2[0]],w);
mp[c2[0]][c1[0]]=min(mp[c2[0]][c1[0]],w);
}
for(int k='A';k<='z';k++)
for(int i='A';i<='z';i++)
for(int j='A';j<='z';j++)
if(mp[i][j]>mp[i][k]+mp[k][j])
mp[i][j]=mp[i][k]+mp[k][j];
for(int i='A';i<='Y';i++)
if(ans>mp[i]['Z'])
{
ans=mp[i]['Z'];
ansi=i;
}
printf("%c %d",ansi,ans);
return 0;
}