📄 3330061_ac_79ms_944k.cc
字号:
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#define max 1001
using namespace std;
int INF = 2100000000;
struct Node
{
int tar;
int id;
int value;
};
int N, M;
vector<Node> edge[max];
int dis[max];
struct node
{
int value;
int tar;
bool operator<(const node & x) const
{
if (value>x.value) return true;
return false;
}
};
int num[max];
priority_queue< node ,vector<node> > q;
bool used[max];
void dijk(int start)
{
int i, j, k;
while (!q.empty()) q.pop();
for (i = 0; i < N; ++i) dis[i]=INF;
memset(used,false,sizeof(used));
node temp,temp2;
temp.value=0;
temp.tar=start;
q.push(temp);
while (!q.empty())
{
while (!q.empty() && used[q.top().tar]) q.pop();
if (q.empty()) break;
temp=q.top();
q.pop();
used[temp.tar]=true;
dis[temp.tar]=temp.value;
for (k=0;k<edge[temp.tar].size();++k)
{
j=edge[temp.tar][k].tar;
if (dis[temp.tar]+edge[temp.tar][k].value< dis[j] && !used[j])
{
dis[j]=dis[temp.tar]+edge[temp.tar][k].value;
temp2.tar=j;
temp2.value=dis[j];
q.push(temp2);
}
}
}
}
int init()
{
int i, j, k, l;
scanf("%d",&N);
if (N==0)
{
return 0;
}
scanf("%d",&M);
for (i = 0; i < N; i++)
{
edge[i].clear();
}
for (i = 0; i < M; ++i)
{
scanf("%d%d%d",&j,&k,&l);
Node t;
j--;k--;
t.tar = k;t.value = l;t.id = i+1;
edge[j].push_back(t);
t.tar = j;
edge[k].push_back(t);
}
return 1;
}
int dfs(int u)
{
int i, tmp (0);
if (num[u]!=-1)
{
return num[u];
}
for (i = 0; i < edge[u].size(); i++)
{
int v = edge[u][i].tar;
if (dis[u] > dis[v])
{
tmp += dfs(v);
}
}
return num[u] = tmp;
}
int main()
{
int i, j;
while (init())
{
dijk(1);
memset(num,-1,sizeof(num));
num[1] = 1;
printf("%d\n",dfs(0));
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -