题目:http://acm.hdu.edu.cn/showproblem.php?pid=2544
题意:。。。中文题,不再累述。
想法:简单题,spfa水过。
我又更新了一下。用链式向前星练了一下。注意节点数。。太小就WA死了。。
spfa代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=110;
bool vis[maxn];
int link[maxn][maxn],dis[maxn];
int n,m;
queue <int> ss;
void spfa(){
for(int i=1;i<=n;i++)
dis[i]=INF;
dis[1]=0;
memset(vis,false,sizeof(vis));
vis[1]=true;
ss.push(1);
while(!ss.empty()){
int x=ss.front();
ss.pop();
vis[x]=false;
for(int i=1;i<=n;i++){
if(dis[i]>dis[x]+link[x][i]){
dis[i]=dis[x]+link[x][i];
if(!vis[i]){
vis[i]=true;
ss.push(i);
}
}
}
}
cout<<dis[n]<<endl;
}
int main(){
//freopen("123.txt","r",stdin);
while(~scanf("%d%d",&n,&m)&&n&&m){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
link[i][j]=INF;
}
}
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(link[a][b]>c){
link[a][b]=link[b][a]=c;
}
}
spfa();
}
return 0;
}
链式向前星 代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=1<<20;
struct Node{
int to;
int w;
int next;
};
Node node[100];
int head[110],dis[110];
bool vis[110];
int n,m,t;
void add(int a,int b,int c){
node[t].to=b;
node[t].w=c;
node[t].next=head[a];
head[a]=t;
t++;
}
int spfa(){
for(int i=1;i<=n;i++){
vis[i]=0;
dis[i]=maxn;
}
dis[1]=0;
queue <int> ss;
ss.push(1);
while(!ss.empty()){
int x=ss.front();ss.pop();
vis[x]=false;
for(int i=head[x];i!=-1;i=node[i].next){
int v=node[i].to;
if(dis[v]>dis[x]+node[i].w){
dis[v]=dis[x]+node[i].w;
if(!vis[v]){
vis[v]=true;
ss.push(v);
}
}
}
}
return dis[n];
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0){
//memset(node,-1,sizeof(node));
memset(head,-1,sizeof(head));
t=0;
int a,b,c;
while(m--){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
cout<< spfa() <<endl;
}
return 0;
}