就。。一个裸的单源最短路,SPFA和dijistra都可以
代码奉上:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int INF=1e9;
const int N=102;
typedef struct node
{
int v,w;
}node;
vector<node> G[N];
int n,m,ans;
bool vis[N];
int dis[N];
void unit()
{
for(int i=0;i<=n;i++)
G[i].clear();
}
void solve()
{
int i,j,k;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
dis[i]=INF;
for(i=0;i<G[1].size();i++)
dis[G[1][i].v]=min(G[1][i].w,dis[G[1][i].v]);
vis[1]=1;
dis[1]=0;
for(i=0;i<n;i++)
{
int MIN=INF,uu=-1;
for(j=1;j<=n;j++)
if(!vis[j]&&dis[j]<MIN)
{
MIN=dis[j];
uu=j;
}
if(uu==-1) break;
vis[uu]=1;
for(j=0;j<G[uu].size();j++)
{
if(!vis[G[uu][j].v]&& MIN+G[uu][j].w<dis[G[uu][j].v])
dis[G[uu][j].v]=MIN+G[uu][j].w;
}
}
}
int main()
{
int T;
int i,j,uu,vv,ww,ca=0;
node tmp;
cin>>T;
while(T--)
{
cin>>n>>m;
unit();
for(i=1;i<=m;i++)
{
cin>>uu>>vv>>ww;
tmp.v=uu,tmp.w=ww;
G[vv].push_back(tmp);
tmp.v=vv;
G[uu].push_back(tmp);
}
solve();
ca++;
if(dis[n]!=INF) cout<<"Case "<<ca<<": "<<dis[n]<<endl;
else cout<<"Case "<<ca<<": Impossible"<<endl;
}
return 0;
}
SPFA 写法:
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
int mat[101][101], g[101][101], deg[101], d[101];
int bfs(int s, int t) {
int i, u, v;
queue< int > Q;
Q.push(s); d[s] = 0;
while(!Q.empty()) {
u = Q.front(); Q.pop();
for(i = 0; i < deg[u]; i++) {
v = g[u][i];
if(d[v] > d[u] + mat[u][v]) {
d[v] = d[u] + mat[u][v];
Q.push(v);
}
}
}
return d[t];
}
int main() {
int test, cs, n, e, w, i, u, v;
scanf("%d", &test);
for(cs = 1; cs <= test; cs++) {
scanf("%d %d", &n, &e);
memset(mat, 0x3f, sizeof mat);
memset(deg, 0, sizeof deg);
memset(d, 0x3f, sizeof d);
for(i = 0; i < e; i++) {
scanf("%d %d %d", &u, &v, &w);
if(mat[u][v] == 0x3f3f3f3f) {
g[u][deg[u]++] = v;
g[v][deg[v]++] = u;
}
mat[v][u] = mat[u][v] = min(mat[u][v], w);
}
w = bfs(1, n);
if(w == 0x3f3f3f3f) printf("Case %d: Impossible\n", cs);
else printf("Case %d: %d\n", cs, w);
}
return 0;
}